Change to strategy based resolver for finding external tag meta-data.
Removed .cvsignore flag on the facelet taglib dtd.
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/META-INF/MANIFEST.MF b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/META-INF/MANIFEST.MF
index 6b3244b..94072b0 100644
--- a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/META-INF/MANIFEST.MF
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %Bundle-Name.0
 Bundle-SymbolicName: org.eclipse.jst.jsf.facelet.core;singleton:=true
 Bundle-Version: 1.0.0
-Bundle-Activator: org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin
+Bundle-Activator: org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin$Implementation
 Bundle-Localization: plugin
 Require-Bundle: org.eclipse.core.runtime,
  org.eclipse.wst.common.project.facet.core,
@@ -21,7 +21,8 @@
  org.eclipse.emf.common;bundle-version="2.4.0",
  org.eclipse.jst.j2ee;bundle-version="1.1.105",
  org.eclipse.emf.ecore;bundle-version="2.4.0",
- org.eclipse.ui;bundle-version="3.4.0"
+ org.eclipse.ui;bundle-version="3.4.0",
+ org.eclipse.emf.edit.ui;bundle-version="2.4.0"
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Import-Package: org.eclipse.jdt.core,
@@ -37,10 +38,15 @@
  org.eclipse.wst.xml.core.internal.contentmodel,
  org.eclipse.wst.xml.core.internal.contentmodel.factory,
  org.eclipse.wst.xml.core.internal.regions
-Export-Package: org.eclipse.jst.jsf.facelet.core.internal,
- org.eclipse.jst.jsf.facelet.core.internal.cm,
- org.eclipse.jst.jsf.facelet.core.internal.facet,
- org.eclipse.jst.jsf.facelet.core.internal.registry,
- org.eclipse.jst.jsf.facelet.core.internal.tagmodel,
- org.eclipse.jst.jsf.facelet.core.internal.util,
- org.eclipse.jst.jsf.facelet.core.internal.view
+Export-Package: org.eclipse.jst.jsf.facelet.core.internal;x-internal:=true,
+ org.eclipse.jst.jsf.facelet.core.internal.cm;x-internal:=true,
+ org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd;x-friends:="org.eclipse.jst.jsf.facelet.tagsupport",
+ org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl;x-internal:=true,
+ org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.provider;x-internal:=true,
+ org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.util;x-internal:=true,
+ org.eclipse.jst.jsf.facelet.core.internal.cm.strategy;x-internal:=true,
+ org.eclipse.jst.jsf.facelet.core.internal.facet;x-internal:=true,
+ org.eclipse.jst.jsf.facelet.core.internal.registry;x-internal:=true,
+ org.eclipse.jst.jsf.facelet.core.internal.tagmodel;x-internal:=true,
+ org.eclipse.jst.jsf.facelet.core.internal.util;x-internal:=true,
+ org.eclipse.jst.jsf.facelet.core.internal.view;x-internal:=true
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/dtd/.cvsignore b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/dtd/.cvsignore
deleted file mode 100644
index 24f067f..0000000
--- a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/dtd/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-facelet-taglib_1_0.dtd
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/dtd/facelet-taglib_1_0.dtd b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/dtd/facelet-taglib_1_0.dtd
new file mode 100644
index 0000000..ec1a3d7
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/dtd/facelet-taglib_1_0.dtd
@@ -0,0 +1,36 @@
+<!--
+ Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ Licensed under the Common Development and Distribution License,
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ 
+   http://www.sun.com/cddl/
+   
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 
+ implied. See the License for the specific language governing
+ permissions and limitations under the License.
+ 
+ $Id: facelet-taglib_1_0.dtd,v 1.1 2008/06/10 17:24:13 cbateman Exp $
+-->
+
+<!ELEMENT facelet-taglib (library-class|(namespace,(tag|function)+))>
+<!ATTLIST facelet-taglib xmlns CDATA #FIXED "http://java.sun.com/JSF/Facelet">
+<!ELEMENT namespace (#PCDATA)>
+<!ELEMENT library-class (#PCDATA)>
+<!ELEMENT tag (tag-name,(handler-class|component|converter|validator|source))>
+<!ELEMENT tag-name (#PCDATA)>
+<!ELEMENT handler-class (#PCDATA)>
+<!ELEMENT component (component-type,renderer-type?,handler-class?)>
+<!ELEMENT component-type (#PCDATA)>
+<!ELEMENT renderer-type (#PCDATA)>
+<!ELEMENT converter (converter-id, handler-class?)>
+<!ELEMENT converter-id (#PCDATA)>
+<!ELEMENT validator (validator-id, handler-class?)>
+<!ELEMENT validator-id (#PCDATA)>
+<!ELEMENT source (#PCDATA)>
+<!ELEMENT function (function-name,function-class,function-signature)>
+<!ELEMENT function-name (#PCDATA)>
+<!ELEMENT function-class (#PCDATA)>
+<!ELEMENT function-signature (#PCDATA)>
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/icons/full/obj16/AttributeData.gif b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/icons/full/obj16/AttributeData.gif
new file mode 100644
index 0000000..c414fe9
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/icons/full/obj16/AttributeData.gif
Binary files differ
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/icons/full/obj16/ElementData.gif b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/icons/full/obj16/ElementData.gif
new file mode 100644
index 0000000..d92f34c
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/icons/full/obj16/ElementData.gif
Binary files differ
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/additionalTagMetadata.ecore b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/additionalTagMetadata.ecore
new file mode 100644
index 0000000..38f283a
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/additionalTagMetadata.ecore
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0"
+    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="addtagmd"
+    nsURI="http://org.eclipse.jst.jsf.facelet.core/additionalTagMetadata.ecore" nsPrefix="addTagMD">
+  <eClassifiers xsi:type="ecore:EClass" name="ElementData">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
+      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
+        <details key="kind" value="element"/>
+        <details key="name" value="name"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="attributes" upperBound="-1"
+        eType="#//AttributeData" containment="true">
+      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
+        <details key="kind" value="element"/>
+        <details key="name" value="attribute"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="AttributeData">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
+      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
+        <details key="kind" value="element"/>
+        <details key="name" value="name"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="usage" eType="#//AttributeUsage">
+      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
+        <details key="kind" value="element"/>
+        <details key="name" value="usage"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="description" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
+      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
+        <details key="kind" value="element"/>
+        <details key="name" value="description"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EEnum" name="AttributeUsage">
+    <eLiterals name="OPTIONAL"/>
+    <eLiterals name="REQUIRED" value="1"/>
+    <eLiterals name="FIXED" value="2"/>
+    <eLiterals name="PROHIBITED" value="3"/>
+  </eClassifiers>
+</ecore:EPackage>
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/additionalTagMetadata.genmodel b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/additionalTagMetadata.genmodel
new file mode 100644
index 0000000..b87ea5a
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/additionalTagMetadata.genmodel
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<genmodel:GenModel xmi:version="2.0"
+    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
+    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText=""
+    modelDirectory="/org.eclipse.jst.jsf.facelet.core/src" editDirectory="/org.eclipse.jst.jsf.facelet.core/src"
+    modelPluginID="org.eclipse.jst.jsf.facelet.core" templateDirectory="templates"
+    dynamicTemplates="true" modelName="AdditionalTagMetadata" editPluginClass="org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin"
+    nonNLSMarkers="true" importerID="org.eclipse.emf.importer.ecore" complianceLevel="5.0"
+    copyrightFields="false" language="">
+  <foreignModel>additionalTagMetadata.ecore</foreignModel>
+  <genPackages prefix="AddTagMD" basePackage="org.eclipse.jst.jsf.facelet.core.internal.cm"
+      disposableProviderFactory="true" ecorePackage="additionalTagMetadata.ecore#/">
+    <genEnums typeSafeEnumCompatible="false" ecoreEnum="additionalTagMetadata.ecore#//AttributeUsage">
+      <genEnumLiterals ecoreEnumLiteral="additionalTagMetadata.ecore#//AttributeUsage/OPTIONAL"/>
+      <genEnumLiterals ecoreEnumLiteral="additionalTagMetadata.ecore#//AttributeUsage/REQUIRED"/>
+      <genEnumLiterals ecoreEnumLiteral="additionalTagMetadata.ecore#//AttributeUsage/FIXED"/>
+      <genEnumLiterals ecoreEnumLiteral="additionalTagMetadata.ecore#//AttributeUsage/PROHIBITED"/>
+    </genEnums>
+    <genClasses ecoreClass="additionalTagMetadata.ecore#//ElementData">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute additionalTagMetadata.ecore#//ElementData/name"/>
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference additionalTagMetadata.ecore#//ElementData/attributes"/>
+    </genClasses>
+    <genClasses ecoreClass="additionalTagMetadata.ecore#//AttributeData">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute additionalTagMetadata.ecore#//AttributeData/name"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute additionalTagMetadata.ecore#//AttributeData/usage"/>
+    </genClasses>
+  </genPackages>
+</genmodel:GenModel>
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/templates/Header.javajetinc b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/templates/Header.javajetinc
new file mode 100644
index 0000000..81fae8b
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/model/templates/Header.javajetinc
@@ -0,0 +1,10 @@
+/*******************************************************************************

+ * Copyright (c) 2008 Oracle Corporation.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *    Oracle - initial API and implementation

+ *******************************************************************************/ 

diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/plugin.properties b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/plugin.properties
index f16c1fc..acce93c 100644
--- a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/plugin.properties
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/plugin.properties
Binary files differ
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/plugin.xml b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/plugin.xml
index 4c454f5..e268c54 100644
--- a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/plugin.xml
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/plugin.xml
@@ -85,5 +85,17 @@
           </description>
        </static-preset>
     </extension>
-
+    <extension
+        point="org.eclipse.emf.edit.itemProviderAdapterFactories">
+        <factory 
+       uri = "http://org.eclipse.jst.jsf.facelet.core/additionalTagMetadata.ecore" 
+       class = "org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.provider.AddTagMDItemProviderAdapterFactory" 
+       supportedTypes = 
+         "org.eclipse.emf.edit.provider.IEditingDomainItemProvider
+          org.eclipse.emf.edit.provider.IStructuredItemContentProvider
+          org.eclipse.emf.edit.provider.ITreeItemContentProvider
+          org.eclipse.emf.edit.provider.IItemLabelProvider
+          org.eclipse.emf.edit.provider.IItemPropertySource
+          org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.provider.IResourceProvider"/>
+  </extension>
 </plugin>
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/FaceletCorePlugin.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/FaceletCorePlugin.java
index 4368c7f..fc348b3 100644
--- a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/FaceletCorePlugin.java
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/FaceletCorePlugin.java
@@ -1,56 +1,102 @@
 package org.eclipse.jst.jsf.facelet.core.internal;
 
 import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Plugin;
 import org.eclipse.core.runtime.Status;
-import org.osgi.framework.BundleContext;
+import org.eclipse.emf.common.EMFPlugin;
+import org.eclipse.emf.common.util.ResourceLocator;
 
 /**
  * The activator class controls the plug-in life cycle
  */
-public class FaceletCorePlugin extends Plugin
+public class FaceletCorePlugin extends EMFPlugin
 {
 
     /**
+     * Keep track of the singleton.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public static final FaceletCorePlugin INSTANCE = new FaceletCorePlugin();
+
+    /**
      * The plug-in ID
      */
     public static final String       PLUGIN_ID = "org.eclipse.jst.jsf.facelet.core"; //$NON-NLS-1$
 
     // The shared instance
-    private static FaceletCorePlugin plugin;
+    private static Implementation plugin;
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext)
+    /**
+     * Create the instance.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
      */
-    @Override
-    public void start(final BundleContext context) throws Exception
+    public FaceletCorePlugin()
     {
-        super.start(context);
-        plugin = this;
+        super
+          (new ResourceLocator [] 
+           {
+           });
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
+    /**
+     * Returns the singleton instance of the Eclipse plugin.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the singleton instance.
+     * @generated
      */
     @Override
-    public void stop(final BundleContext context) throws Exception
+    public ResourceLocator getPluginResourceLocator()
     {
-        plugin = null;
-        super.stop(context);
+        return plugin;
     }
 
     /**
+     * Returns the singleton instance of the Eclipse plugin.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the singleton instance.
+     * @generated
+     */
+    public static Implementation getPlugin()
+    {
+        return plugin;
+    }
+
+    /**
+     * The actual implementation of the Eclipse <b>Plugin</b>.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public static class Implementation extends EclipsePlugin
+    {
+        /**
+         * Creates an instance.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        public Implementation()
+        {
+            super();
+
+            // Remember the static instance.
+            //
+            plugin = this;
+        }
+    }
+
+    
+    /**
      * Returns the shared instance
      * 
      * @return the shared instance
      */
-    public static FaceletCorePlugin getDefault()
+    public static Implementation getDefault()
     {
         return plugin;
     }
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/ExternalTagInfo.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/ExternalTagInfo.java
index 769d732..705a57b 100644
--- a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/ExternalTagInfo.java
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/ExternalTagInfo.java
@@ -1,17 +1,26 @@
 package org.eclipse.jst.jsf.facelet.core.internal.cm;
 
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
 import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
 
 /**
- * Represents information about Facelets brought from external sources such
- * as the JSP tag library.
+ * Represents information about Facelets brought from external sources such as
+ * the JSP tag library.
  * 
  * @author cbateman
- *
+ * 
  */
 public abstract class ExternalTagInfo
 {
     /**
+     * Single instance of the null external tag info
+     */
+    public static ExternalTagInfo  NULL_INSTANCE = new NullExternalTagInfo();
+
+    /**
      * @param tagName
      * @return the node map of attributes for the tag called tagName
      */
@@ -21,8 +30,75 @@
      * @param tagName
      * @param key
      * @return the tag property in the CM model for tagName at key or null if
-     * not found.
+     *         not found.
      */
     public abstract Object getTagProperty(final String tagName, final String key);
 
+    /**
+     * @author cbateman
+     *
+     */
+    public static class NullExternalTagInfo extends ExternalTagInfo
+    {
+        private NullExternalTagInfo()
+        {
+            // no external instantitation
+        }
+        
+        @Override
+        public CMNamedNodeMap getAttributes(final String tagName)
+        {
+            return new NullCMNamedNodeMap();
+        }
+
+        @Override
+        public Object getTagProperty(final String tagName, final String key)
+        {
+            // no data so always null
+            return null;
+        }
+
+        private static class NullCMNamedNodeMap implements CMNamedNodeMap
+        {
+            public int getLength()
+            {
+                return 0;
+            }
+
+            public CMNode getNamedItem(final String name)
+            {
+                return null;
+            }
+
+            public CMNode item(final int index)
+            {
+                return null;
+            }
+
+            public Iterator iterator()
+            {
+                return new NullIterator();
+            }
+        }
+
+        private static class NullIterator implements Iterator
+        {
+            public boolean hasNext()
+            {
+                return false;
+            }
+
+            public Object next()
+            {
+                throw new NoSuchElementException();
+            }
+
+            public void remove()
+            {
+                throw new UnsupportedOperationException(
+                        "can not remove regions via iterator"); //$NON-NLS-1$
+            }
+        }
+    }
+
 }
\ No newline at end of file
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/FaceletDocumentFactory.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/FaceletDocumentFactory.java
index 318895d..c7b3965 100644
--- a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/FaceletDocumentFactory.java
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/FaceletDocumentFactory.java
@@ -109,7 +109,7 @@
      */
     private ExternalTagInfo createExternalTagInfo(final String uri)
     {
-        ExternalTagInfo tldTagInfo = new MetadataTagInfo(uri);
+        ExternalTagInfo tldTagInfo = new MetadataTagInfo(_project, uri);
         final ITaglibRecord[] tldrecs = TaglibIndex
                 .getAvailableTaglibRecords(_project.getFullPath());
         FIND_TLDRECORD: for (final ITaglibRecord rec : tldrecs)
@@ -118,7 +118,7 @@
             if (uri.equals(matchUri))
             {
                 final CMDocumentFactoryTLD factory = new CMDocumentFactoryTLD();
-                tldTagInfo = new MetadataTagInfo((TLDDocument) factory
+                tldTagInfo = new MetadataTagInfo(_project, (TLDDocument) factory
                         .createCMDocument(rec));
                 break FIND_TLDRECORD;
             }
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/Messages.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/Messages.java
deleted file mode 100644
index e5515ed..0000000
--- a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/Messages.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facelet.core.internal.cm;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * Externalized messages.
- * 
- * @author cbateman
- *
- */
-public final class Messages
-{
-    private static final String         BUNDLE_NAME     = "org.eclipse.jst.jsf.facelet.core.internal.cm.messages"; //$NON-NLS-1$
-
-    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-                                                                .getBundle(BUNDLE_NAME);
-
-    private Messages()
-    {
-        // no instantiation
-    }
-
-    /**
-     * @param key
-     * @return the string for the key
-     */
-    public static String getString(String key)
-    {
-        try
-        {
-            return RESOURCE_BUNDLE.getString(key);
-        }
-        catch (MissingResourceException e)
-        {
-            return '!' + key + '!';
-        }
-    }
-}
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/MetadataTagInfo.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/MetadataTagInfo.java
index dd54729..0e91290 100644
--- a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/MetadataTagInfo.java
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/MetadataTagInfo.java
@@ -1,18 +1,18 @@
 package org.eclipse.jst.jsf.facelet.core.internal.cm;
 
 import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
 
-import org.eclipse.jst.jsf.facelet.core.internal.tagmodel.IFaceletTagConstants;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jst.jsf.common.dom.TagIdentifier;
+import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
+import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.IExternalMetadataStrategy;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.JSPExternalMetadataStrategy;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.MDExternalMetadataStrategy;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.TagInfoStrategyComposite;
 import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
 
 /**
  * An external tag info that checks first the meta-data repository and second in
@@ -23,53 +23,71 @@
  */
 /* package */class MetadataTagInfo extends ExternalTagInfo
 {
-    private static final String VAR = "var"; //$NON-NLS-1$
-    private static final String VALUE = "value"; //$NON-NLS-1$
-    private static final String SRC = "src"; //$NON-NLS-1$
-    private static final String NAME = "name"; //$NON-NLS-1$
-    private static final String HOTKEY = "hotkey"; //$NON-NLS-1$
-    private static final String TEMPLATE = "template"; //$NON-NLS-1$
-    private static final String BINDING = "binding"; //$NON-NLS-1$
-    private static final String ID = "id"; //$NON-NLS-1$
-    private final TLDDocument _doc;
-    private final String      _uri;
+    private final String                      _uri;
+//    private final MDExternalMetadataStrategy  _mdStrategy;
+//    private final JSPExternalMetadataStrategy _jspStrategy;
+    private final TagInfoStrategyComposite    _compositeStrategy;
 
-    public MetadataTagInfo(final String uri)
+    private MetadataTagInfo(final IProject project, final TLDDocument doc,
+            final String uri)
     {
-        _doc = null;
         _uri = uri;
+        IExternalMetadataStrategy mdStrategy = MDExternalMetadataStrategy.create(project);
+        JSPExternalMetadataStrategy jspStrategy = new JSPExternalMetadataStrategy(doc);
+
+        final List<String> ids = new ArrayList<String>();
+        ids.add(MDExternalMetadataStrategy.STRATEGY_ID);
+        ids.add(JSPExternalMetadataStrategy.STRATEGY_ID);
+
+        _compositeStrategy = new TagInfoStrategyComposite(ids);
+        _compositeStrategy.addStrategy(mdStrategy);
+        _compositeStrategy.addStrategy(jspStrategy);
     }
 
-    public MetadataTagInfo(final TLDDocument doc)
+    public MetadataTagInfo(final IProject project, final String uri)
     {
-        if (doc == null)
-        {
-            throw new IllegalArgumentException(
-                    "Use MetadataTagInfo(uri) if no tld document"); //$NON-NLS-1$
-        }
-        _doc = doc;
-        _uri = doc.getUri();
+        this(project, null, uri);
+    }
+
+    /**
+     * @param project
+     * @param doc
+     */
+    public MetadataTagInfo(final IProject project, final TLDDocument doc)
+    {
+        this(project, doc, doc.getUri());
     }
 
     @Override
     public Object getTagProperty(final String tagName, final String key)
     {
-        // TODO: this is a temporary hack for EclipseCon
-        if (IFaceletTagConstants.URI_JSF_FACELETS.equals(_uri)
-                && "description".equals(key)) //$NON-NLS-1$
-        {
-            return FACELET_TAG_DESCRIPTIONS.get(tagName);
-        }
+        final TagIdentifier tagId = TagIdentifierFactory.createJSPTagWrapper(
+                _uri, tagName);
+        _compositeStrategy.resetIterator();
 
-        if (_doc != null)
+        for (ExternalTagInfo tagInfo = getNextExternalInfo(tagId); tagInfo != _compositeStrategy
+                .getNoResult(); tagInfo = getNextExternalInfo(tagId))
         {
-            final CMElementDeclaration element = (CMElementDeclaration) _doc
-                    .getElements().getNamedItem(tagName);
-            if (element != null)
+            try
             {
-                return element.getProperty(key);
+                if (tagInfo != _compositeStrategy.getNoResult())
+                {
+                    final Object value = tagInfo.getTagProperty(tagName, key);
+
+                    if (value != null)
+                    {
+                        return value;
+                    }
+                }
+
+                // fall-through
+            }
+            catch (final Exception e)
+            {
+                FaceletCorePlugin.log("During meta-data strategy", e); //$NON-NLS-1$
             }
         }
+
         return null;
     }
 
@@ -81,233 +99,39 @@
     @Override
     public CMNamedNodeMap getAttributes(final String tagName)
     {
-        // TODO: this is a temporary hack for EclipseCon
-        if (IFaceletTagConstants.URI_JSF_FACELETS.equals(_uri))
-        {
-            return _faceletData.get(tagName);
-        }
+        final TagIdentifier tagId = TagIdentifierFactory.createJSPTagWrapper(
+                _uri, tagName);
+        _compositeStrategy.resetIterator();
 
-        if (_doc != null)
+        for (ExternalTagInfo tagInfo = getNextExternalInfo(tagId); tagInfo != _compositeStrategy
+                .getNoResult(); tagInfo = getNextExternalInfo(tagId))
         {
-            final CMElementDeclaration element = (CMElementDeclaration) _doc
-                    .getElements().getNamedItem(tagName);
-
-            if (element != null)
+            try
             {
-                return element.getAttributes();
+                if (tagInfo != _compositeStrategy.getNoResult())
+                {
+                    final CMNamedNodeMap nodeMap = tagInfo
+                            .getAttributes(tagName);
+
+                    if (nodeMap != null)
+                    {
+                        return nodeMap;
+                    }
+                }
+
+                // fall-through
+            }
+            catch (final Exception e)
+            {
+                FaceletCorePlugin.log("During meta-data strategy", e); //$NON-NLS-1$
             }
         }
 
         return null;
     }
 
-    // private CMNamedNodeMap getOrCreateNodeMap(final String tagName)
-    // {
-    // InternalNamedNodeMap elementNamed = _nodeMap.get(tagName);
-    //
-    // if (elementNamed == null)
-    // {
-    // elementNamed = new InternalNamedNodeMap();
-    //
-    // _nodeMap.put(tagName, elementNamed);
-    // }
-    // return elementNamed;
-    // }
-
-    private static class InternalNamedNodeMap implements CMNamedNodeMap
+    private ExternalTagInfo getNextExternalInfo(final TagIdentifier input)
     {
-        private final List<CMNode> _nodes = new ArrayList<CMNode>();
-
-        private void add(CMNode node)
-        {
-            _nodes.add(node);
-        }
-
-        public int getLength()
-        {
-            return _nodes.size();
-        }
-
-        public CMNode getNamedItem(final String name)
-        {
-            for (final CMNode foundNode : _nodes)
-            {
-                if (name.equals(foundNode.getNodeName()))
-                {
-                    return foundNode;
-                }
-            }
-            return null;
-        }
-
-        public CMNode item(int index)
-        {
-            if (index < _nodes.size())
-            {
-                return _nodes.get(index);
-            }
-            return null;
-        }
-
-        public Iterator<?> iterator()
-        {
-            return Collections.unmodifiableList(_nodes).iterator();
-        }
+        return _compositeStrategy.perform(input);
     }
-
-    // temporary: transfer out to metadata
-    final static Map<String, InternalNamedNodeMap> _faceletData;
-
-    static
-    {
-        final String ID_DESCRIPTION = Messages.getString("MetadataTagInfo.ID_DESCRIPTION"); //$NON-NLS-1$
-        final String BINDING_DESCRIPTION = Messages.getString("MetadataTagInfo.BINDING_DESCRIPTION"); //$NON-NLS-1$
-        final String TEMPLATE_DESCRIPTION = Messages.getString("MetadataTagInfo.TEMPLATE_DESCRIPTION"); //$NON-NLS-1$
-        final String HOTKEY_DESCRIPTION = Messages.getString("MetadataTagInfo.HOTKEY_DESCRIPTION"); //$NON-NLS-1$
-        final String DEFINE_NAME_DESCRIPTION = Messages.getString("MetadataTagInfo.DEFINE_NAME_DESCRIPTION"); //$NON-NLS-1$
-        final String SRC_DESCRIPTION = Messages.getString("MetadataTagInfo.SRC_DESCRIPTION"); //$NON-NLS-1$
-        final String INSERT_NAME_DESCRIPTION = Messages.getString("MetadataTagInfo.INSERT_NAME_DESCRIPTION"); //$NON-NLS-1$
-        final String PARAM_NAME_DESCRIPTION = Messages.getString("MetadataTagInfo.PARAM_NAME_DESCRIPTION"); //$NON-NLS-1$
-        final String PARAM_VALUE_DESCRIPTION = Messages.getString("MetadataTagInfo.PARAM_VALUE_DESCRIPTION"); //$NON-NLS-1$
-        final String REPEAT_VAR_DESCRIPTION = Messages.getString("MetadataTagInfo.REPEAT_VAR_DESCRIPTION"); //$NON-NLS-1$
-        final String REPEAT_VALUE_DESCRIPTION = Messages.getString("MetadataTagInfo.REPEAT_VALUE_DESCRIPTION"); //$NON-NLS-1$
-
-        final Map<String, InternalNamedNodeMap> map = new HashMap<String, InternalNamedNodeMap>();
-        // component
-        InternalNamedNodeMap nodeMap = new InternalNamedNodeMap();
-        nodeMap.add(createAttribute(ID, CMAttributeDeclaration.OPTIONAL,
-                ID_DESCRIPTION));
-        nodeMap.add(createAttribute(BINDING, CMAttributeDeclaration.OPTIONAL,
-                BINDING_DESCRIPTION));
-        map.put(IFaceletTagConstants.TAG_COMPONENT, nodeMap);
-
-        // composition
-        nodeMap = new InternalNamedNodeMap();
-        nodeMap.add(createAttribute(TEMPLATE,
-                CMAttributeDeclaration.OPTIONAL, TEMPLATE_DESCRIPTION));
-        map.put(IFaceletTagConstants.TAG_COMPOSITION, nodeMap);
-
-        // debug
-        nodeMap = new InternalNamedNodeMap();
-        nodeMap.add(createAttribute(HOTKEY, CMAttributeDeclaration.OPTIONAL,
-                HOTKEY_DESCRIPTION));
-        map.put(IFaceletTagConstants.TAG_DEBUG, nodeMap);
-
-        // decorate
-        nodeMap = new InternalNamedNodeMap();
-        nodeMap.add(createAttribute(TEMPLATE,
-                CMAttributeDeclaration.REQUIRED, TEMPLATE_DESCRIPTION));
-        map.put(IFaceletTagConstants.TAG_DECORATE, nodeMap);
-
-        // define
-        nodeMap = new InternalNamedNodeMap();
-        nodeMap.add(createAttribute(NAME, CMAttributeDeclaration.REQUIRED,
-                DEFINE_NAME_DESCRIPTION));
-        map.put(IFaceletTagConstants.TAG_DEFINE, nodeMap);
-
-        // fragment
-        nodeMap = new InternalNamedNodeMap();
-        nodeMap.add(createAttribute(ID, CMAttributeDeclaration.OPTIONAL,
-                ID_DESCRIPTION));
-        nodeMap.add(createAttribute(BINDING, CMAttributeDeclaration.OPTIONAL,
-                BINDING_DESCRIPTION));
-        map.put(IFaceletTagConstants.TAG_FRAGMENT, nodeMap);
-
-        // include
-        nodeMap = new InternalNamedNodeMap();
-        nodeMap.add(createAttribute(SRC, CMAttributeDeclaration.REQUIRED,
-                SRC_DESCRIPTION));
-        map.put(IFaceletTagConstants.TAG_INCLUDE, nodeMap);
-
-        // insert
-        nodeMap = new InternalNamedNodeMap();
-        nodeMap.add(createAttribute(NAME, CMAttributeDeclaration.OPTIONAL,
-                INSERT_NAME_DESCRIPTION));
-        map.put(IFaceletTagConstants.TAG_INSERT, nodeMap);
-
-        // param
-        nodeMap = new InternalNamedNodeMap();
-        nodeMap.add(createAttribute(NAME, CMAttributeDeclaration.REQUIRED,
-                PARAM_NAME_DESCRIPTION));
-        nodeMap.add(createAttribute(VALUE, CMAttributeDeclaration.REQUIRED,
-                PARAM_VALUE_DESCRIPTION));
-        map.put(IFaceletTagConstants.TAG_PARAM, nodeMap);
-
-        // remove
-        nodeMap = new InternalNamedNodeMap();
-        // no attributes
-        map.put(IFaceletTagConstants.TAG_PARAM, nodeMap);
-
-        // repeat
-        nodeMap = new InternalNamedNodeMap();
-        nodeMap.add(createAttribute(VALUE, CMAttributeDeclaration.REQUIRED,
-                REPEAT_VALUE_DESCRIPTION));
-        nodeMap.add(createAttribute(VAR, CMAttributeDeclaration.REQUIRED,
-                REPEAT_VAR_DESCRIPTION));
-        map.put(IFaceletTagConstants.TAG_REPEAT, nodeMap);
-
-        _faceletData = Collections.unmodifiableMap(map);
-    }
-
-    private static CMAttributeDeclaration createAttribute(final String name,
-            final int usage, final String description)
-    {
-        AttributeCMAdapter attribute = new AttributeCMAdapter(name, usage);
-        attribute.setDescription(description);
-        return attribute;
-    }
-
-    final static Map<String, String> FACELET_TAG_DESCRIPTIONS = new HashMap<String, String>();
-
-    static
-    {
-        FACELET_TAG_DESCRIPTIONS
-                .put(
-                        IFaceletTagConstants.TAG_COMPONENT,
-                        Messages.getString("MetadataTagInfo.COMPONENT_TAG_DESCRIPTION.1")); //$NON-NLS-1$
-        StringBuffer text = new StringBuffer();
-        text
-                .append(Messages.getString("MetadataTagInfo.COMPONENT_TAG_DETAIL.1")); //$NON-NLS-1$
-        text.append(Messages.getString("MetadataTagInfo.COMPONENT_TAG_DETAIL.2")); //$NON-NLS-1$
-        text.append(Messages.getString("MetadataTagInfo.COMPONENT_TAG_DETAIL.3")); //$NON-NLS-1$
-        text.append(Messages.getString("MetadataTagInfo.COMPONENT_TAG_DETAIL.4")); //$NON-NLS-1$
-        text.append(Messages.getString("MetadataTagInfo.COMPONENT_TAG_DETAIL.5")); //$NON-NLS-1$
-        text.append(Messages.getString("MetadataTagInfo.COMPONENT_TAG_DETAIL.6")); //$NON-NLS-1$
-        text.append(Messages.getString("MetadataTagInfo.COMPONENT_TAG_DETAIL.7")); //$NON-NLS-1$
-
-        FACELET_TAG_DESCRIPTIONS.put(IFaceletTagConstants.TAG_COMPOSITION, text
-                .toString());
-
-        FACELET_TAG_DESCRIPTIONS
-                .put(
-                        IFaceletTagConstants.TAG_DEBUG,
-                        Messages.getString("MetadataTagInfo.DEBUG_TAG_DESCRIPTION.1")); //$NON-NLS-1$
-
-        text = new StringBuffer();
-        text
-                .append(Messages.getString("MetadataTagInfo.DEBUG_TAG_DETAIL.1")); //$NON-NLS-1$
-        text.append(Messages.getString("MetadataTagInfo.DEBUG_TAG_DETAIL.2")); //$NON-NLS-1$
-        text.append(Messages.getString("MetadataTagInfo.DEBUG_TAG_DETAIL.3")); //$NON-NLS-1$
-        text.append(Messages.getString("MetadataTagInfo.DEBUG_TAG_DETAIL.4")); //$NON-NLS-1$
-        text.append(Messages.getString("MetadataTagInfo.DEBUG_TAG_DETAIL.5")); //$NON-NLS-1$
-        text.append(Messages.getString("MetadataTagInfo.DEBUG_TAG_DETAIL.6")); //$NON-NLS-1$
-        text.append(Messages.getString("MetadataTagInfo.DEBUG_TAG_DETAIL.7")); //$NON-NLS-1$
-        FACELET_TAG_DESCRIPTIONS.put(IFaceletTagConstants.TAG_DECORATE, text
-                .toString());
-        FACELET_TAG_DESCRIPTIONS.put(IFaceletTagConstants.TAG_DEFINE
-                , Messages.getString("MetadataTagInfo.DEFINE_TAG_DESCRIPTION.1")); //$NON-NLS-1$
-        FACELET_TAG_DESCRIPTIONS.put(IFaceletTagConstants.TAG_FRAGMENT
-                , Messages.getString("MetadataTagInfo.FRAGMENT_TAG_DESCRIPTION.1")); //$NON-NLS-1$
-        FACELET_TAG_DESCRIPTIONS.put(IFaceletTagConstants.TAG_INCLUDE
-                , Messages.getString("MetadataTagInfo.INCLUDE_TAG_DESCRIPTION.1")); //$NON-NLS-1$
-        FACELET_TAG_DESCRIPTIONS.put(IFaceletTagConstants.TAG_INSERT
-                , Messages.getString("MetadataTagInfo.INSERT_TAG_DESCRIPTION.1")); //$NON-NLS-1$
-        FACELET_TAG_DESCRIPTIONS.put(IFaceletTagConstants.TAG_PARAM
-                , Messages.getString("MetadataTagInfo.PARAM_TAG_DESCRIPTION.1")); //$NON-NLS-1$
-        FACELET_TAG_DESCRIPTIONS.put(IFaceletTagConstants.TAG_REMOVE
-                , Messages.getString("MetadataTagInfo.REMOVE_TAG_DESCRIPTION.1")); //$NON-NLS-1$
-        FACELET_TAG_DESCRIPTIONS.put(IFaceletTagConstants.TAG_REPEAT
-                , Messages.getString("MetadataTagInfo.REPEAT_TAG_DESCRIPTION.1")); //$NON-NLS-1$
-    }
-
 }
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AddTagMDFactory.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AddTagMDFactory.java
new file mode 100644
index 0000000..5685afa
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AddTagMDFactory.java
@@ -0,0 +1,56 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: AddTagMDFactory.java,v 1.1 2008/06/10 17:23:59 cbateman Exp $
+ */
+package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd;
+
+import org.eclipse.emf.ecore.EFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage
+ * @generated
+ */
+public interface AddTagMDFactory extends EFactory
+{
+    /**
+     * The singleton instance of the factory.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    AddTagMDFactory eINSTANCE = org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AddTagMDFactoryImpl.init();
+
+    /**
+     * Returns a new object of class '<em>Element Data</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Element Data</em>'.
+     * @generated
+     */
+    ElementData createElementData();
+
+    /**
+     * Returns a new object of class '<em>Attribute Data</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Attribute Data</em>'.
+     * @generated
+     */
+    AttributeData createAttributeData();
+
+    /**
+     * Returns the package supported by this factory.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the package supported by this factory.
+     * @generated
+     */
+    AddTagMDPackage getAddTagMDPackage();
+
+} //AddTagMDFactory
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AddTagMDPackage.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AddTagMDPackage.java
new file mode 100644
index 0000000..ac8c042
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AddTagMDPackage.java
@@ -0,0 +1,339 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: AddTagMDPackage.java,v 1.1 2008/06/10 17:24:00 cbateman Exp $
+ */
+package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface AddTagMDPackage extends EPackage
+{
+    /**
+     * The package name.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    String eNAME = "addtagmd"; //$NON-NLS-1$
+
+    /**
+     * The package namespace URI.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    String eNS_URI = "http://org.eclipse.jst.jsf.facelet.core/additionalTagMetadata.ecore"; //$NON-NLS-1$
+
+    /**
+     * The package namespace name.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    String eNS_PREFIX = "addTagMD"; //$NON-NLS-1$
+
+    /**
+     * The singleton instance of the package.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    AddTagMDPackage eINSTANCE = org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AddTagMDPackageImpl.init();
+
+    /**
+     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.ElementDataImpl <em>Element Data</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.ElementDataImpl
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AddTagMDPackageImpl#getElementData()
+     * @generated
+     */
+    int ELEMENT_DATA = 0;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int ELEMENT_DATA__NAME = 0;
+
+    /**
+     * The feature id for the '<em><b>Attributes</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int ELEMENT_DATA__ATTRIBUTES = 1;
+
+    /**
+     * The number of structural features of the '<em>Element Data</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int ELEMENT_DATA_FEATURE_COUNT = 2;
+
+    /**
+     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AttributeDataImpl <em>Attribute Data</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AttributeDataImpl
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AddTagMDPackageImpl#getAttributeData()
+     * @generated
+     */
+    int ATTRIBUTE_DATA = 1;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int ATTRIBUTE_DATA__NAME = 0;
+
+    /**
+     * The feature id for the '<em><b>Usage</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int ATTRIBUTE_DATA__USAGE = 1;
+
+    /**
+     * The feature id for the '<em><b>Description</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int ATTRIBUTE_DATA__DESCRIPTION = 2;
+
+    /**
+     * The number of structural features of the '<em>Attribute Data</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int ATTRIBUTE_DATA_FEATURE_COUNT = 3;
+
+    /**
+     * The meta object id for the '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeUsage <em>Attribute Usage</em>}' enum.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeUsage
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AddTagMDPackageImpl#getAttributeUsage()
+     * @generated
+     */
+    int ATTRIBUTE_USAGE = 2;
+
+
+    /**
+     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData <em>Element Data</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Element Data</em>'.
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData
+     * @generated
+     */
+    EClass getElementData();
+
+    /**
+     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData#getName <em>Name</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for the attribute '<em>Name</em>'.
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData#getName()
+     * @see #getElementData()
+     * @generated
+     */
+    EAttribute getElementData_Name();
+
+    /**
+     * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData#getAttributes <em>Attributes</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for the containment reference list '<em>Attributes</em>'.
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData#getAttributes()
+     * @see #getElementData()
+     * @generated
+     */
+    EReference getElementData_Attributes();
+
+    /**
+     * Returns the meta object for class '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData <em>Attribute Data</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Attribute Data</em>'.
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData
+     * @generated
+     */
+    EClass getAttributeData();
+
+    /**
+     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getName <em>Name</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for the attribute '<em>Name</em>'.
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getName()
+     * @see #getAttributeData()
+     * @generated
+     */
+    EAttribute getAttributeData_Name();
+
+    /**
+     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getUsage <em>Usage</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for the attribute '<em>Usage</em>'.
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getUsage()
+     * @see #getAttributeData()
+     * @generated
+     */
+    EAttribute getAttributeData_Usage();
+
+    /**
+     * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getDescription <em>Description</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for the attribute '<em>Description</em>'.
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getDescription()
+     * @see #getAttributeData()
+     * @generated
+     */
+    EAttribute getAttributeData_Description();
+
+    /**
+     * Returns the meta object for enum '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeUsage <em>Attribute Usage</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for enum '<em>Attribute Usage</em>'.
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeUsage
+     * @generated
+     */
+    EEnum getAttributeUsage();
+
+    /**
+     * Returns the factory that creates the instances of the model.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the factory that creates the instances of the model.
+     * @generated
+     */
+    AddTagMDFactory getAddTagMDFactory();
+
+    /**
+     * <!-- begin-user-doc -->
+     * Defines literals for the meta objects that represent
+     * <ul>
+     *   <li>each class,</li>
+     *   <li>each feature of each class,</li>
+     *   <li>each enum,</li>
+     *   <li>and each data type</li>
+     * </ul>
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @SuppressWarnings("hiding")
+    interface Literals
+    {
+        /**
+         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.ElementDataImpl <em>Element Data</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.ElementDataImpl
+         * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AddTagMDPackageImpl#getElementData()
+         * @generated
+         */
+        EClass ELEMENT_DATA = eINSTANCE.getElementData();
+
+        /**
+         * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        EAttribute ELEMENT_DATA__NAME = eINSTANCE.getElementData_Name();
+
+        /**
+         * The meta object literal for the '<em><b>Attributes</b></em>' containment reference list feature.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        EReference ELEMENT_DATA__ATTRIBUTES = eINSTANCE.getElementData_Attributes();
+
+        /**
+         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AttributeDataImpl <em>Attribute Data</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AttributeDataImpl
+         * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AddTagMDPackageImpl#getAttributeData()
+         * @generated
+         */
+        EClass ATTRIBUTE_DATA = eINSTANCE.getAttributeData();
+
+        /**
+         * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        EAttribute ATTRIBUTE_DATA__NAME = eINSTANCE.getAttributeData_Name();
+
+        /**
+         * The meta object literal for the '<em><b>Usage</b></em>' attribute feature.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        EAttribute ATTRIBUTE_DATA__USAGE = eINSTANCE.getAttributeData_Usage();
+
+        /**
+         * The meta object literal for the '<em><b>Description</b></em>' attribute feature.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        EAttribute ATTRIBUTE_DATA__DESCRIPTION = eINSTANCE.getAttributeData_Description();
+
+        /**
+         * The meta object literal for the '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeUsage <em>Attribute Usage</em>}' enum.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeUsage
+         * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AddTagMDPackageImpl#getAttributeUsage()
+         * @generated
+         */
+        EEnum ATTRIBUTE_USAGE = eINSTANCE.getAttributeUsage();
+
+    }
+
+} //AddTagMDPackage
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AttributeData.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AttributeData.java
new file mode 100644
index 0000000..9b3f355
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AttributeData.java
@@ -0,0 +1,112 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: AttributeData.java,v 1.1 2008/06/10 17:24:00 cbateman Exp $
+ */
+package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Attribute Data</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getUsage <em>Usage</em>}</li>
+ *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getDescription <em>Description</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage#getAttributeData()
+ * @model
+ * @generated
+ */
+public interface AttributeData extends EObject
+{
+    /**
+     * Returns the value of the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of the '<em>Name</em>' attribute isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @return the value of the '<em>Name</em>' attribute.
+     * @see #setName(String)
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage#getAttributeData_Name()
+     * @model extendedMetaData="kind='element' name='name'"
+     * @generated
+     */
+    String getName();
+
+    /**
+     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getName <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @param value the new value of the '<em>Name</em>' attribute.
+     * @see #getName()
+     * @generated
+     */
+    void setName(String value);
+
+    /**
+     * Returns the value of the '<em><b>Usage</b></em>' attribute.
+     * The literals are from the enumeration {@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeUsage}.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of the '<em>Usage</em>' attribute isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @return the value of the '<em>Usage</em>' attribute.
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeUsage
+     * @see #setUsage(AttributeUsage)
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage#getAttributeData_Usage()
+     * @model extendedMetaData="kind='element' name='usage'"
+     * @generated
+     */
+    AttributeUsage getUsage();
+
+    /**
+     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getUsage <em>Usage</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @param value the new value of the '<em>Usage</em>' attribute.
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeUsage
+     * @see #getUsage()
+     * @generated
+     */
+    void setUsage(AttributeUsage value);
+
+    /**
+     * Returns the value of the '<em><b>Description</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of the '<em>Description</em>' attribute isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @return the value of the '<em>Description</em>' attribute.
+     * @see #setDescription(String)
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage#getAttributeData_Description()
+     * @model extendedMetaData="kind='element' name='description'"
+     * @generated
+     */
+    String getDescription();
+
+    /**
+     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData#getDescription <em>Description</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @param value the new value of the '<em>Description</em>' attribute.
+     * @see #getDescription()
+     * @generated
+     */
+    void setDescription(String value);
+
+} // AttributeData
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AttributeUsage.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AttributeUsage.java
new file mode 100644
index 0000000..f4f9b48
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/AttributeUsage.java
@@ -0,0 +1,287 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: AttributeUsage.java,v 1.1 2008/06/10 17:23:59 cbateman Exp $
+ */
+package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Attribute Usage</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage#getAttributeUsage()
+ * @model
+ * @generated
+ */
+public enum AttributeUsage implements Enumerator
+{
+    /**
+     * The '<em><b>OPTIONAL</b></em>' literal object.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #OPTIONAL_VALUE
+     * @generated
+     * @ordered
+     */
+    OPTIONAL(0, "OPTIONAL", "OPTIONAL"), //$NON-NLS-1$ //$NON-NLS-2$
+
+    /**
+     * The '<em><b>REQUIRED</b></em>' literal object.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #REQUIRED_VALUE
+     * @generated
+     * @ordered
+     */
+    REQUIRED(1, "REQUIRED", "REQUIRED"), //$NON-NLS-1$ //$NON-NLS-2$
+
+    /**
+     * The '<em><b>FIXED</b></em>' literal object.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #FIXED_VALUE
+     * @generated
+     * @ordered
+     */
+    FIXED(2, "FIXED", "FIXED"), //$NON-NLS-1$ //$NON-NLS-2$
+
+    /**
+     * The '<em><b>PROHIBITED</b></em>' literal object.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #PROHIBITED_VALUE
+     * @generated
+     * @ordered
+     */
+    PROHIBITED(3, "PROHIBITED", "PROHIBITED"); //$NON-NLS-1$ //$NON-NLS-2$
+
+    /**
+     * The '<em><b>OPTIONAL</b></em>' literal value.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of '<em><b>OPTIONAL</b></em>' literal object isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @see #OPTIONAL
+     * @model
+     * @generated
+     * @ordered
+     */
+    public static final int OPTIONAL_VALUE = 0;
+
+    /**
+     * The '<em><b>REQUIRED</b></em>' literal value.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of '<em><b>REQUIRED</b></em>' literal object isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @see #REQUIRED
+     * @model
+     * @generated
+     * @ordered
+     */
+    public static final int REQUIRED_VALUE = 1;
+
+    /**
+     * The '<em><b>FIXED</b></em>' literal value.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of '<em><b>FIXED</b></em>' literal object isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @see #FIXED
+     * @model
+     * @generated
+     * @ordered
+     */
+    public static final int FIXED_VALUE = 2;
+
+    /**
+     * The '<em><b>PROHIBITED</b></em>' literal value.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of '<em><b>PROHIBITED</b></em>' literal object isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @see #PROHIBITED
+     * @model
+     * @generated
+     * @ordered
+     */
+    public static final int PROHIBITED_VALUE = 3;
+
+    /**
+     * An array of all the '<em><b>Attribute Usage</b></em>' enumerators.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private static final AttributeUsage[] VALUES_ARRAY =
+        new AttributeUsage[]
+        {
+            OPTIONAL,
+            REQUIRED,
+            FIXED,
+            PROHIBITED,
+        };
+
+    /**
+     * A public read-only list of all the '<em><b>Attribute Usage</b></em>' enumerators.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public static final List<AttributeUsage> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+    /**
+     * Returns the '<em><b>Attribute Usage</b></em>' literal with the specified literal value.
+     * <!-- begin-user-doc -->
+     * @param literal 
+     * @return the attribute usage
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public static AttributeUsage get(String literal)
+    {
+        for (int i = 0; i < VALUES_ARRAY.length; ++i)
+        {
+            AttributeUsage result = VALUES_ARRAY[i];
+            if (result.toString().equals(literal))
+            {
+                return result;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Returns the '<em><b>Attribute Usage</b></em>' literal with the specified name.
+     * <!-- begin-user-doc -->
+     * @param name 
+     * @return the attribute usage
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public static AttributeUsage getByName(String name)
+    {
+        for (int i = 0; i < VALUES_ARRAY.length; ++i)
+        {
+            AttributeUsage result = VALUES_ARRAY[i];
+            if (result.getName().equals(name))
+            {
+                return result;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Returns the '<em><b>Attribute Usage</b></em>' literal with the specified integer value.
+     * <!-- begin-user-doc -->
+     * @param value 
+     * @return the attribute usage
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public static AttributeUsage get(int value)
+    {
+        switch (value)
+        {
+            case OPTIONAL_VALUE: return OPTIONAL;
+            case REQUIRED_VALUE: return REQUIRED;
+            case FIXED_VALUE: return FIXED;
+            case PROHIBITED_VALUE: return PROHIBITED;
+        }
+        return null;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private final int value;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private final String name;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private final String literal;
+
+    /**
+     * Only this class can construct instances.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private AttributeUsage(int value, String name, String literal)
+    {
+        this.value = value;
+        this.name = name;
+        this.literal = literal;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public int getValue()
+    {
+      return value;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName()
+    {
+      return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getLiteral()
+    {
+      return literal;
+    }
+
+    /**
+     * Returns the literal value of the enumerator, which is its string representation.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString()
+    {
+        return literal;
+    }
+    
+} //AttributeUsage
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/ElementData.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/ElementData.java
new file mode 100644
index 0000000..dad6835
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/ElementData.java
@@ -0,0 +1,75 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: ElementData.java,v 1.1 2008/06/10 17:24:00 cbateman Exp $
+ */
+package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Element Data</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData#getAttributes <em>Attributes</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage#getElementData()
+ * @model
+ * @generated
+ */
+public interface ElementData extends EObject
+{
+    /**
+     * Returns the value of the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of the '<em>Name</em>' attribute isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @return the value of the '<em>Name</em>' attribute.
+     * @see #setName(String)
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage#getElementData_Name()
+     * @model extendedMetaData="kind='element' name='name'"
+     * @generated
+     */
+    String getName();
+
+    /**
+     * Sets the value of the '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData#getName <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @param value the new value of the '<em>Name</em>' attribute.
+     * @see #getName()
+     * @generated
+     */
+    void setName(String value);
+
+    /**
+     * Returns the value of the '<em><b>Attributes</b></em>' containment reference list.
+     * The list contents are of type {@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData}.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of the '<em>Attributes</em>' reference list isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @return the value of the '<em>Attributes</em>' containment reference list.
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage#getElementData_Attributes()
+     * @model containment="true"
+     *        extendedMetaData="kind='element' name='attribute'"
+     * @generated
+     */
+    EList<AttributeData> getAttributes();
+
+} // ElementData
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/AddTagMDFactoryImpl.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/AddTagMDFactoryImpl.java
new file mode 100644
index 0000000..1a4e9d1
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/AddTagMDFactoryImpl.java
@@ -0,0 +1,187 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: AddTagMDFactoryImpl.java,v 1.1 2008/06/10 17:24:02 cbateman Exp $
+ */
+package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class AddTagMDFactoryImpl extends EFactoryImpl implements AddTagMDFactory
+{
+    /**
+     * Creates the default factory implementation.
+     * <!-- begin-user-doc -->
+     * @return the factory
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public static AddTagMDFactory init()
+    {
+        try
+        {
+            AddTagMDFactory theAddTagMDFactory = (AddTagMDFactory)EPackage.Registry.INSTANCE.getEFactory("http://org.eclipse.jst.jsf.facelet.core/additionalTagMetadata.ecore"); //$NON-NLS-1$ 
+            if (theAddTagMDFactory != null)
+            {
+                return theAddTagMDFactory;
+            }
+        }
+        catch (Exception exception)
+        {
+            EcorePlugin.INSTANCE.log(exception);
+        }
+        return new AddTagMDFactoryImpl();
+    }
+
+    /**
+     * Creates an instance of the factory.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public AddTagMDFactoryImpl()
+    {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public EObject create(EClass eClass)
+    {
+        switch (eClass.getClassifierID())
+        {
+            case AddTagMDPackage.ELEMENT_DATA: return createElementData();
+            case AddTagMDPackage.ATTRIBUTE_DATA: return createAttributeData();
+            default:
+                throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
+        }
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object createFromString(EDataType eDataType, String initialValue)
+    {
+        switch (eDataType.getClassifierID())
+        {
+            case AddTagMDPackage.ATTRIBUTE_USAGE:
+                return createAttributeUsageFromString(eDataType, initialValue);
+            default:
+                throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
+        }
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String convertToString(EDataType eDataType, Object instanceValue)
+    {
+        switch (eDataType.getClassifierID())
+        {
+            case AddTagMDPackage.ATTRIBUTE_USAGE:
+                return convertAttributeUsageToString(eDataType, instanceValue);
+            default:
+                throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
+        }
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public ElementData createElementData()
+    {
+        ElementDataImpl elementData = new ElementDataImpl();
+        return elementData;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public AttributeData createAttributeData()
+    {
+        AttributeDataImpl attributeData = new AttributeDataImpl();
+        return attributeData;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * @param eDataType 
+     * @param initialValue 
+     * @return the attribute usage
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public AttributeUsage createAttributeUsageFromString(EDataType eDataType, String initialValue)
+    {
+        AttributeUsage result = AttributeUsage.get(initialValue);
+        if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+        return result;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * @param eDataType 
+     * @param instanceValue 
+     * @return the usage string
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String convertAttributeUsageToString(EDataType eDataType, Object instanceValue)
+    {
+        return instanceValue == null ? null : instanceValue.toString();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public AddTagMDPackage getAddTagMDPackage()
+    {
+        return (AddTagMDPackage)getEPackage();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * @return the package
+     * <!-- end-user-doc -->
+     * @deprecated
+     * @generated
+     */
+    @Deprecated
+    public static AddTagMDPackage getPackage()
+    {
+        return AddTagMDPackage.eINSTANCE;
+    }
+
+} //AddTagMDFactoryImpl
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/AddTagMDPackageImpl.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/AddTagMDPackageImpl.java
new file mode 100644
index 0000000..238f326
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/AddTagMDPackageImpl.java
@@ -0,0 +1,352 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: AddTagMDPackageImpl.java,v 1.1 2008/06/10 17:24:01 cbateman Exp $
+ */
+package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDFactory;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeUsage;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class AddTagMDPackageImpl extends EPackageImpl implements AddTagMDPackage
+{
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass elementDataEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass attributeDataEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EEnum attributeUsageEEnum = null;
+
+    /**
+     * Creates an instance of the model <b>Package</b>, registered with
+     * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+     * package URI value.
+     * <p>Note: the correct way to create the package is via the static
+     * factory method {@link #init init()}, which also performs
+     * initialization of the package, or returns the registered package,
+     * if one already exists.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.emf.ecore.EPackage.Registry
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage#eNS_URI
+     * @see #init()
+     * @generated
+     */
+    private AddTagMDPackageImpl()
+    {
+        super(eNS_URI, AddTagMDFactory.eINSTANCE);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private static boolean isInited = false;
+
+    /**
+     * Creates, registers, and initializes the <b>Package</b> for this
+     * model, and for any others upon which it depends.  Simple
+     * dependencies are satisfied by calling this method on all
+     * dependent packages before doing anything else.  This method drives
+     * initialization for interdependent packages directly, in parallel
+     * with this package, itself.
+     * <p>Of this package and its interdependencies, all packages which
+     * have not yet been registered by their URI values are first created
+     * and registered.  The packages are then initialized in two steps:
+     * meta-model objects for all of the packages are created before any
+     * are initialized, since one package's meta-model objects may refer to
+     * those of another.
+     * <p>Invocation of this method will not affect any packages that have
+     * already been initialized.
+     * <!-- begin-user-doc -->
+     * @return the package
+     * <!-- end-user-doc -->
+     * @see #eNS_URI
+     * @see #createPackageContents()
+     * @see #initializePackageContents()
+     * @generated
+     */
+    public static AddTagMDPackage init()
+    {
+        if (isInited) return (AddTagMDPackage)EPackage.Registry.INSTANCE.getEPackage(AddTagMDPackage.eNS_URI);
+
+        // Obtain or create and register package
+        AddTagMDPackageImpl theAddTagMDPackage = (AddTagMDPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof AddTagMDPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new AddTagMDPackageImpl());
+
+        isInited = true;
+
+        // Create package meta-data objects
+        theAddTagMDPackage.createPackageContents();
+
+        // Initialize created meta-data
+        theAddTagMDPackage.initializePackageContents();
+
+        // Mark meta-data to indicate it can't be changed
+        theAddTagMDPackage.freeze();
+
+        return theAddTagMDPackage;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getElementData()
+    {
+        return elementDataEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EAttribute getElementData_Name()
+    {
+        return (EAttribute)elementDataEClass.getEStructuralFeatures().get(0);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EReference getElementData_Attributes()
+    {
+        return (EReference)elementDataEClass.getEStructuralFeatures().get(1);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getAttributeData()
+    {
+        return attributeDataEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EAttribute getAttributeData_Name()
+    {
+        return (EAttribute)attributeDataEClass.getEStructuralFeatures().get(0);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EAttribute getAttributeData_Usage()
+    {
+        return (EAttribute)attributeDataEClass.getEStructuralFeatures().get(1);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EAttribute getAttributeData_Description()
+    {
+        return (EAttribute)attributeDataEClass.getEStructuralFeatures().get(2);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EEnum getAttributeUsage()
+    {
+        return attributeUsageEEnum;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public AddTagMDFactory getAddTagMDFactory()
+    {
+        return (AddTagMDFactory)getEFactoryInstance();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private boolean isCreated = false;
+
+    /**
+     * Creates the meta-model objects for the package.  This method is
+     * guarded to have no affect on any invocation but its first.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void createPackageContents()
+    {
+        if (isCreated) return;
+        isCreated = true;
+
+        // Create classes and their features
+        elementDataEClass = createEClass(ELEMENT_DATA);
+        createEAttribute(elementDataEClass, ELEMENT_DATA__NAME);
+        createEReference(elementDataEClass, ELEMENT_DATA__ATTRIBUTES);
+
+        attributeDataEClass = createEClass(ATTRIBUTE_DATA);
+        createEAttribute(attributeDataEClass, ATTRIBUTE_DATA__NAME);
+        createEAttribute(attributeDataEClass, ATTRIBUTE_DATA__USAGE);
+        createEAttribute(attributeDataEClass, ATTRIBUTE_DATA__DESCRIPTION);
+
+        // Create enums
+        attributeUsageEEnum = createEEnum(ATTRIBUTE_USAGE);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private boolean isInitialized = false;
+
+    /**
+     * Complete the initialization of the package and its meta-model.  This
+     * method is guarded to have no affect on any invocation but its first.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void initializePackageContents()
+    {
+        if (isInitialized) return;
+        isInitialized = true;
+
+        // Initialize package
+        setName(eNAME);
+        setNsPrefix(eNS_PREFIX);
+        setNsURI(eNS_URI);
+
+        // Create type parameters
+
+        // Set bounds for type parameters
+
+        // Add supertypes to classes
+
+        // Initialize classes and features; add operations and parameters
+        initEClass(elementDataEClass, ElementData.class, "ElementData", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+        initEAttribute(getElementData_Name(), ecorePackage.getEString(), "name", null, 0, 1, ElementData.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+        initEReference(getElementData_Attributes(), this.getAttributeData(), null, "attributes", null, 0, -1, ElementData.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+
+        initEClass(attributeDataEClass, AttributeData.class, "AttributeData", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+        initEAttribute(getAttributeData_Name(), ecorePackage.getEString(), "name", null, 0, 1, AttributeData.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+        initEAttribute(getAttributeData_Usage(), this.getAttributeUsage(), "usage", null, 0, 1, AttributeData.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+        initEAttribute(getAttributeData_Description(), ecorePackage.getEString(), "description", null, 0, 1, AttributeData.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+
+        // Initialize enums and add enum literals
+        initEEnum(attributeUsageEEnum, AttributeUsage.class, "AttributeUsage"); //$NON-NLS-1$
+        addEEnumLiteral(attributeUsageEEnum, AttributeUsage.OPTIONAL);
+        addEEnumLiteral(attributeUsageEEnum, AttributeUsage.REQUIRED);
+        addEEnumLiteral(attributeUsageEEnum, AttributeUsage.FIXED);
+        addEEnumLiteral(attributeUsageEEnum, AttributeUsage.PROHIBITED);
+
+        // Create resource
+        createResource(eNS_URI);
+
+        // Create annotations
+        // http:///org/eclipse/emf/ecore/util/ExtendedMetaData
+        createExtendedMetaDataAnnotations();
+    }
+
+    /**
+     * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected void createExtendedMetaDataAnnotations()
+    {
+        String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData"; //$NON-NLS-1$		
+        addAnnotation
+          (getElementData_Name(), 
+           source, 
+           new String[] 
+           {
+             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
+             "name", "name" //$NON-NLS-1$ //$NON-NLS-2$
+           });		
+        addAnnotation
+          (getElementData_Attributes(), 
+           source, 
+           new String[] 
+           {
+             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
+             "name", "attribute" //$NON-NLS-1$ //$NON-NLS-2$
+           });		
+        addAnnotation
+          (getAttributeData_Name(), 
+           source, 
+           new String[] 
+           {
+             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
+             "name", "name" //$NON-NLS-1$ //$NON-NLS-2$
+           });		
+        addAnnotation
+          (getAttributeData_Usage(), 
+           source, 
+           new String[] 
+           {
+             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
+             "name", "usage" //$NON-NLS-1$ //$NON-NLS-2$
+           });		
+        addAnnotation
+          (getAttributeData_Description(), 
+           source, 
+           new String[] 
+           {
+             "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
+             "name", "description" //$NON-NLS-1$ //$NON-NLS-2$
+           });
+    }
+
+} //AddTagMDPackageImpl
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/AttributeDataImpl.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/AttributeDataImpl.java
new file mode 100644
index 0000000..8cbcab0
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/AttributeDataImpl.java
@@ -0,0 +1,294 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: AttributeDataImpl.java,v 1.1 2008/06/10 17:24:02 cbateman Exp $
+ */
+package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeUsage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Attribute Data</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AttributeDataImpl#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AttributeDataImpl#getUsage <em>Usage</em>}</li>
+ *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.AttributeDataImpl#getDescription <em>Description</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class AttributeDataImpl extends EObjectImpl implements AttributeData
+{
+    /**
+     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected String name = NAME_EDEFAULT;
+
+    /**
+     * The default value of the '{@link #getUsage() <em>Usage</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getUsage()
+     * @generated
+     * @ordered
+     */
+    protected static final AttributeUsage USAGE_EDEFAULT = AttributeUsage.OPTIONAL;
+
+    /**
+     * The cached value of the '{@link #getUsage() <em>Usage</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getUsage()
+     * @generated
+     * @ordered
+     */
+    protected AttributeUsage usage = USAGE_EDEFAULT;
+
+    /**
+     * The default value of the '{@link #getDescription() <em>Description</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getDescription()
+     * @generated
+     * @ordered
+     */
+    protected static final String DESCRIPTION_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getDescription() <em>Description</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getDescription()
+     * @generated
+     * @ordered
+     */
+    protected String description = DESCRIPTION_EDEFAULT;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected AttributeDataImpl()
+    {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass()
+    {
+        return AddTagMDPackage.Literals.ATTRIBUTE_DATA;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName()
+    {
+        return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setName(String newName)
+    {
+        String oldName = name;
+        name = newName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, AddTagMDPackage.ATTRIBUTE_DATA__NAME, oldName, name));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public AttributeUsage getUsage()
+    {
+        return usage;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setUsage(AttributeUsage newUsage)
+    {
+        AttributeUsage oldUsage = usage;
+        usage = newUsage == null ? USAGE_EDEFAULT : newUsage;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, AddTagMDPackage.ATTRIBUTE_DATA__USAGE, oldUsage, usage));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getDescription()
+    {
+        return description;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setDescription(String newDescription)
+    {
+        String oldDescription = description;
+        description = newDescription;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, AddTagMDPackage.ATTRIBUTE_DATA__DESCRIPTION, oldDescription, description));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType)
+    {
+        switch (featureID)
+        {
+            case AddTagMDPackage.ATTRIBUTE_DATA__NAME:
+                return getName();
+            case AddTagMDPackage.ATTRIBUTE_DATA__USAGE:
+                return getUsage();
+            case AddTagMDPackage.ATTRIBUTE_DATA__DESCRIPTION:
+                return getDescription();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eSet(int featureID, Object newValue)
+    {
+        switch (featureID)
+        {
+            case AddTagMDPackage.ATTRIBUTE_DATA__NAME:
+                setName((String)newValue);
+                return;
+            case AddTagMDPackage.ATTRIBUTE_DATA__USAGE:
+                setUsage((AttributeUsage)newValue);
+                return;
+            case AddTagMDPackage.ATTRIBUTE_DATA__DESCRIPTION:
+                setDescription((String)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID)
+    {
+        switch (featureID)
+        {
+            case AddTagMDPackage.ATTRIBUTE_DATA__NAME:
+                setName(NAME_EDEFAULT);
+                return;
+            case AddTagMDPackage.ATTRIBUTE_DATA__USAGE:
+                setUsage(USAGE_EDEFAULT);
+                return;
+            case AddTagMDPackage.ATTRIBUTE_DATA__DESCRIPTION:
+                setDescription(DESCRIPTION_EDEFAULT);
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID)
+    {
+        switch (featureID)
+        {
+            case AddTagMDPackage.ATTRIBUTE_DATA__NAME:
+                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+            case AddTagMDPackage.ATTRIBUTE_DATA__USAGE:
+                return usage != USAGE_EDEFAULT;
+            case AddTagMDPackage.ATTRIBUTE_DATA__DESCRIPTION:
+                return DESCRIPTION_EDEFAULT == null ? description != null : !DESCRIPTION_EDEFAULT.equals(description);
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString()
+    {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (name: "); //$NON-NLS-1$
+        result.append(name);
+        result.append(", usage: "); //$NON-NLS-1$
+        result.append(usage);
+        result.append(", description: "); //$NON-NLS-1$
+        result.append(description);
+        result.append(')');
+        return result.toString();
+    }
+
+} //AttributeDataImpl
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/ElementDataImpl.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/ElementDataImpl.java
new file mode 100644
index 0000000..06689fd
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/impl/ElementDataImpl.java
@@ -0,0 +1,239 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: ElementDataImpl.java,v 1.1 2008/06/10 17:24:02 cbateman Exp $
+ */
+package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Element Data</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.ElementDataImpl#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.impl.ElementDataImpl#getAttributes <em>Attributes</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ElementDataImpl extends EObjectImpl implements ElementData
+{
+    /**
+     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected String name = NAME_EDEFAULT;
+
+    /**
+     * The cached value of the '{@link #getAttributes() <em>Attributes</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getAttributes()
+     * @generated
+     * @ordered
+     */
+    protected EList<AttributeData> attributes;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected ElementDataImpl()
+    {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass()
+    {
+        return AddTagMDPackage.Literals.ELEMENT_DATA;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName()
+    {
+        return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setName(String newName)
+    {
+        String oldName = name;
+        name = newName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, AddTagMDPackage.ELEMENT_DATA__NAME, oldName, name));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<AttributeData> getAttributes()
+    {
+        if (attributes == null)
+        {
+            attributes = new EObjectContainmentEList<AttributeData>(AttributeData.class, this, AddTagMDPackage.ELEMENT_DATA__ATTRIBUTES);
+        }
+        return attributes;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+    {
+        switch (featureID)
+        {
+            case AddTagMDPackage.ELEMENT_DATA__ATTRIBUTES:
+                return ((InternalEList<?>)getAttributes()).basicRemove(otherEnd, msgs);
+        }
+        return super.eInverseRemove(otherEnd, featureID, msgs);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType)
+    {
+        switch (featureID)
+        {
+            case AddTagMDPackage.ELEMENT_DATA__NAME:
+                return getName();
+            case AddTagMDPackage.ELEMENT_DATA__ATTRIBUTES:
+                return getAttributes();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public void eSet(int featureID, Object newValue)
+    {
+        switch (featureID)
+        {
+            case AddTagMDPackage.ELEMENT_DATA__NAME:
+                setName((String)newValue);
+                return;
+            case AddTagMDPackage.ELEMENT_DATA__ATTRIBUTES:
+                getAttributes().clear();
+                getAttributes().addAll((Collection<? extends AttributeData>)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID)
+    {
+        switch (featureID)
+        {
+            case AddTagMDPackage.ELEMENT_DATA__NAME:
+                setName(NAME_EDEFAULT);
+                return;
+            case AddTagMDPackage.ELEMENT_DATA__ATTRIBUTES:
+                getAttributes().clear();
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID)
+    {
+        switch (featureID)
+        {
+            case AddTagMDPackage.ELEMENT_DATA__NAME:
+                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+            case AddTagMDPackage.ELEMENT_DATA__ATTRIBUTES:
+                return attributes != null && !attributes.isEmpty();
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString()
+    {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (name: "); //$NON-NLS-1$
+        result.append(name);
+        result.append(')');
+        return result.toString();
+    }
+
+} //ElementDataImpl
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/AddTagMDItemProviderAdapterFactory.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/AddTagMDItemProviderAdapterFactory.java
new file mode 100644
index 0000000..02afbc9
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/AddTagMDItemProviderAdapterFactory.java
@@ -0,0 +1,246 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: AddTagMDItemProviderAdapterFactory.java,v 1.1 2008/06/10 17:24:05 cbateman Exp $
+ */
+package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.provider;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.emf.edit.provider.ChangeNotifier;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+import org.eclipse.emf.edit.provider.IChangeNotifier;
+import org.eclipse.emf.edit.provider.IDisposable;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.INotifyChangedListener;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.util.AddTagMDAdapterFactory;
+
+/**
+ * This is the factory that is used to provide the interfaces needed to support Viewers.
+ * The adapters generated by this factory convert EMF adapter notifications into calls to {@link #fireNotifyChanged fireNotifyChanged}.
+ * The adapters also support Eclipse property sheets.
+ * Note that most of the adapters are shared among multiple instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class AddTagMDItemProviderAdapterFactory extends AddTagMDAdapterFactory implements ComposeableAdapterFactory, IChangeNotifier, IDisposable
+{
+    /**
+     * This keeps track of the root adapter factory that delegates to this adapter factory.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected ComposedAdapterFactory parentAdapterFactory;
+
+    /**
+     * This is used to implement {@link org.eclipse.emf.edit.provider.IChangeNotifier}.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected IChangeNotifier changeNotifier = new ChangeNotifier();
+
+    /**
+     * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected Collection<Object> supportedTypes = new ArrayList<Object>();
+
+    /**
+     * This constructs an instance.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated NOT
+     */
+    public AddTagMDItemProviderAdapterFactory()
+    {
+        supportedTypes.add(IEditingDomainItemProvider.class);
+        supportedTypes.add(IStructuredItemContentProvider.class);
+        supportedTypes.add(ITreeItemContentProvider.class);
+        supportedTypes.add(IItemLabelProvider.class);
+        supportedTypes.add(IItemPropertySource.class);
+        supportedTypes.add(IResourceProvider.class);
+    }
+
+    /**
+     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData} instances.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected ElementDataItemProvider elementDataItemProvider;
+
+    /**
+     * This creates an adapter for a {@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData}.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Adapter createElementDataAdapter()
+    {
+        if (elementDataItemProvider == null)
+        {
+            elementDataItemProvider = new ElementDataItemProvider(this);
+        }
+
+        return elementDataItemProvider;
+    }
+
+    /**
+     * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData} instances.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected AttributeDataItemProvider attributeDataItemProvider;
+
+    /**
+     * This creates an adapter for a {@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData}.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Adapter createAttributeDataAdapter()
+    {
+        if (attributeDataItemProvider == null)
+        {
+            attributeDataItemProvider = new AttributeDataItemProvider(this);
+        }
+
+        return attributeDataItemProvider;
+    }
+
+    /**
+     * This returns the root adapter factory that contains this factory.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public ComposeableAdapterFactory getRootAdapterFactory()
+    {
+        return parentAdapterFactory == null ? this : parentAdapterFactory.getRootAdapterFactory();
+    }
+
+    /**
+     * This sets the composed adapter factory that contains this factory.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory)
+    {
+        this.parentAdapterFactory = parentAdapterFactory;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean isFactoryForType(Object type)
+    {
+        return supportedTypes.contains(type) || super.isFactoryForType(type);
+    }
+
+    /**
+     * This implementation substitutes the factory itself as the key for the adapter.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Adapter adapt(Notifier notifier, Object type)
+    {
+        return super.adapt(notifier, this);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object adapt(Object object, Object type)
+    {
+        if (isFactoryForType(type))
+        {
+            Object adapter = super.adapt(object, type);
+            if (!(type instanceof Class) || (((Class<?>)type).isInstance(adapter)))
+            {
+                return adapter;
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * This adds a listener.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void addListener(INotifyChangedListener notifyChangedListener)
+    {
+        changeNotifier.addListener(notifyChangedListener);
+    }
+
+    /**
+     * This removes a listener.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void removeListener(INotifyChangedListener notifyChangedListener)
+    {
+        changeNotifier.removeListener(notifyChangedListener);
+    }
+
+    /**
+     * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void fireNotifyChanged(Notification notification)
+    {
+        changeNotifier.fireNotifyChanged(notification);
+
+        if (parentAdapterFactory != null)
+        {
+            parentAdapterFactory.fireNotifyChanged(notification);
+        }
+    }
+
+    /**
+     * This disposes all of the item providers created by this factory. 
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void dispose()
+    {
+        if (elementDataItemProvider != null) elementDataItemProvider.dispose();
+        if (attributeDataItemProvider != null) attributeDataItemProvider.dispose();
+    }
+
+}
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/AttributeDataItemProvider.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/AttributeDataItemProvider.java
new file mode 100644
index 0000000..c6e661d
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/AttributeDataItemProvider.java
@@ -0,0 +1,258 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: AttributeDataItemProvider.java,v 1.1 2008/06/10 17:24:05 cbateman Exp $
+ */
+package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.util.ResourceLocator;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+import org.eclipse.jst.jsf.common.metadata.Trait;
+import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
+import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
+
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData} object.
+ * <!-- begin-user-doc -->
+ * @extends IResourceProvider
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class AttributeDataItemProvider
+    extends ItemProviderAdapter
+    implements
+        IEditingDomainItemProvider,
+        IStructuredItemContentProvider,
+        ITreeItemContentProvider,
+        IItemLabelProvider,
+        IItemPropertySource,
+        IResourceProvider
+{
+    /**
+     * This constructs an instance from a factory and a notifier.
+     * <!-- begin-user-doc -->
+     * @param adapterFactory 
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public AttributeDataItemProvider(AdapterFactory adapterFactory)
+    {
+        super(adapterFactory);
+    }
+
+    /**
+     * This returns the property descriptors for the adapted class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object)
+    {
+        if (itemPropertyDescriptors == null)
+        {
+            super.getPropertyDescriptors(object);
+
+            addNamePropertyDescriptor(object);
+            addUsagePropertyDescriptor(object);
+            addDescriptionPropertyDescriptor(object);
+        }
+        return itemPropertyDescriptors;
+    }
+
+    /**
+     * This adds a property descriptor for the Name feature.
+     * <!-- begin-user-doc -->
+     * @param object 
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected void addNamePropertyDescriptor(Object object)
+    {
+        itemPropertyDescriptors.add
+            (createItemPropertyDescriptor
+                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+                 getResourceLocator(),
+                 getString("_UI_AttributeData_name_feature"), //$NON-NLS-1$
+                 getString("_UI_PropertyDescriptor_description", "_UI_AttributeData_name_feature", "_UI_AttributeData_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+                 AddTagMDPackage.Literals.ATTRIBUTE_DATA__NAME,
+                 true,
+                 false,
+                 false,
+                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+                 null,
+                 null));
+    }
+
+    /**
+     * This adds a property descriptor for the Usage feature.
+     * <!-- begin-user-doc -->
+     * @param object 
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected void addUsagePropertyDescriptor(Object object)
+    {
+        itemPropertyDescriptors.add
+            (createItemPropertyDescriptor
+                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+                 getResourceLocator(),
+                 getString("_UI_AttributeData_usage_feature"), //$NON-NLS-1$
+                 getString("_UI_PropertyDescriptor_description", "_UI_AttributeData_usage_feature", "_UI_AttributeData_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+                 AddTagMDPackage.Literals.ATTRIBUTE_DATA__USAGE,
+                 true,
+                 false,
+                 false,
+                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+                 null,
+                 null));
+    }
+
+    /**
+     * This adds a property descriptor for the Description feature.
+     * <!-- begin-user-doc -->
+     * @param object 
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected void addDescriptionPropertyDescriptor(Object object)
+    {
+        itemPropertyDescriptors.add
+            (createItemPropertyDescriptor
+                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+                 getResourceLocator(),
+                 getString("_UI_AttributeData_description_feature"), //$NON-NLS-1$
+                 getString("_UI_PropertyDescriptor_description", "_UI_AttributeData_description_feature", "_UI_AttributeData_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+                 AddTagMDPackage.Literals.ATTRIBUTE_DATA__DESCRIPTION,
+                 true,
+                 false,
+                 false,
+                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+                 null,
+                 null));
+    }
+
+    /**
+     * This returns AttributeData.gif.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object getImage(Object object)
+    {
+        return overlayImage(object, getResourceLocator().getImage("full/obj16/AttributeData")); //$NON-NLS-1$
+    }
+
+    /**
+     * This returns the label text for the adapted class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String getText(Object object)
+    {
+        String label = ((AttributeData)object).getName();
+        return label == null || label.length() == 0 ?
+            getString("_UI_AttributeData_type") : //$NON-NLS-1$
+            getString("_UI_AttributeData_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
+    }
+
+    /**
+     * This handles model notifications by calling {@link #updateChildren} to update any cached
+     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void notifyChanged(Notification notification)
+    {
+        updateChildren(notification);
+
+        switch (notification.getFeatureID(AttributeData.class))
+        {
+            case AddTagMDPackage.ATTRIBUTE_DATA__NAME:
+            case AddTagMDPackage.ATTRIBUTE_DATA__USAGE:
+            case AddTagMDPackage.ATTRIBUTE_DATA__DESCRIPTION:
+                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+                return;
+        }
+        super.notifyChanged(notification);
+    }
+
+    /**
+     * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+     * that can be created under this object.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object)
+    {
+        super.collectNewChildDescriptors(newChildDescriptors, object);
+    }
+
+    /**
+     * Return the resource locator for this item provider's resources.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public ResourceLocator getResourceLocator()
+    {
+        return FaceletCorePlugin.INSTANCE;
+    }
+    
+    public String getTranslatedString(EObject object, EStructuralFeature feature)
+    {
+        Object value = object.eGet(feature);
+        
+        if (value != null)
+        {
+            EObject  testObject = object;
+            
+            while (! (testObject instanceof Trait) 
+                    && testObject != null)
+            {
+                testObject = testObject.eContainer();
+            }
+            
+            if (testObject instanceof Trait)
+            {
+                Trait trait = (Trait) testObject;
+                value = TraitValueHelper.getNLSValue(trait, value.toString());
+            }
+            return value.toString();
+        }
+
+        return object.toString();
+    }
+}
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/ElementDataItemProvider.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/ElementDataItemProvider.java
new file mode 100644
index 0000000..4aaf58c
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/ElementDataItemProvider.java
@@ -0,0 +1,228 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: ElementDataItemProvider.java,v 1.1 2008/06/10 17:24:04 cbateman Exp $
+ */
+package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+import org.eclipse.jst.jsf.common.metadata.Trait;
+import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
+import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData} object.
+ * <!-- begin-user-doc -->
+ * @extends IResourceProvider
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ElementDataItemProvider
+    extends ItemProviderAdapter
+    implements
+        IEditingDomainItemProvider,
+        IStructuredItemContentProvider,
+        ITreeItemContentProvider,
+        IItemLabelProvider,
+        IItemPropertySource,
+        IResourceProvider
+{
+    /**
+     * This constructs an instance from a factory and a notifier.
+     * <!-- begin-user-doc -->
+     * @param adapterFactory 
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public ElementDataItemProvider(AdapterFactory adapterFactory)
+    {
+        super(adapterFactory);
+    }
+
+    /**
+     * This returns the property descriptors for the adapted class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object)
+    {
+        if (itemPropertyDescriptors == null)
+        {
+            super.getPropertyDescriptors(object);
+
+            addNamePropertyDescriptor(object);
+            addAttributesPropertyDescriptor(object);
+        }
+        return itemPropertyDescriptors;
+    }
+
+    /**
+     * This adds a property descriptor for the Name feature.
+     * <!-- begin-user-doc -->
+     * @param object 
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected void addNamePropertyDescriptor(Object object)
+    {
+        itemPropertyDescriptors.add
+            (createItemPropertyDescriptor
+                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+                 getResourceLocator(),
+                 getString("_UI_ElementData_name_feature"), //$NON-NLS-1$
+                 getString("_UI_PropertyDescriptor_description", "_UI_ElementData_name_feature", "_UI_ElementData_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+                 AddTagMDPackage.Literals.ELEMENT_DATA__NAME,
+                 true,
+                 false,
+                 false,
+                 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+                 null,
+                 null));
+    }
+
+    /**
+     * This adds a property descriptor for the Attributes feature.
+     * <!-- begin-user-doc -->
+     * @param object 
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected void addAttributesPropertyDescriptor(Object object)
+    {
+        itemPropertyDescriptors.add
+            (createItemPropertyDescriptor
+                (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+                 getResourceLocator(),
+                 getString("_UI_ElementData_attributes_feature"), //$NON-NLS-1$
+                 getString("_UI_PropertyDescriptor_description", "_UI_ElementData_attributes_feature", "_UI_ElementData_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+                 AddTagMDPackage.Literals.ELEMENT_DATA__ATTRIBUTES,
+                 true,
+                 false,
+                 true,
+                 null,
+                 null,
+                 null));
+    }
+
+    /**
+     * This returns ElementData.gif.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object getImage(Object object)
+    {
+        return overlayImage(object, getResourceLocator().getImage("full/obj16/ElementData")); //$NON-NLS-1$
+    }
+
+    /**
+     * This returns the label text for the adapted class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String getText(Object object)
+    {
+        String label = ((ElementData)object).getName();
+        return label == null || label.length() == 0 ?
+            getString("_UI_ElementData_type") : //$NON-NLS-1$
+            getString("_UI_ElementData_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
+    }
+
+    /**
+     * This handles model notifications by calling {@link #updateChildren} to update any cached
+     * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void notifyChanged(Notification notification)
+    {
+        updateChildren(notification);
+
+        switch (notification.getFeatureID(ElementData.class))
+        {
+            case AddTagMDPackage.ELEMENT_DATA__NAME:
+                fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+                return;
+        }
+        super.notifyChanged(notification);
+    }
+
+    /**
+     * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+     * that can be created under this object.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object)
+    {
+        super.collectNewChildDescriptors(newChildDescriptors, object);
+    }
+
+    /**
+     * Return the resource locator for this item provider's resources.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public ResourceLocator getResourceLocator()
+    {
+        return FaceletCorePlugin.INSTANCE;
+    }
+
+    public String getTranslatedString(EObject object, EStructuralFeature feature)
+    {
+        Object value = object.eGet(feature);
+        
+        if (value != null)
+        {
+            EObject  testObject = object;
+            
+            while (! (testObject instanceof Trait) 
+                    && testObject != null)
+            {
+                testObject = testObject.eContainer();
+            }
+            
+            if (testObject instanceof Trait)
+            {
+                Trait trait = (Trait) testObject;
+                value = TraitValueHelper.getNLSValue(trait, value.toString());
+            }
+            return value.toString();
+        }
+
+        return object.toString();
+    }
+
+}
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/IResourceProvider.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/IResourceProvider.java
new file mode 100644
index 0000000..d441f59
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/provider/IResourceProvider.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Oracle Corporation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Cameron Bateman - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.provider;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+/**
+ * A translated string provider.
+ * 
+ * @author cbateman
+ * 
+ */
+public interface IResourceProvider
+{
+    /**
+     * @param object
+     * @param feature
+     * @return the string value of object.eGet(feature)
+     */
+    String getTranslatedString(final EObject object,
+            final EStructuralFeature feature);
+}
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/util/AddTagMDAdapterFactory.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/util/AddTagMDAdapterFactory.java
new file mode 100644
index 0000000..aee7078
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/util/AddTagMDAdapterFactory.java
@@ -0,0 +1,156 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: AddTagMDAdapterFactory.java,v 1.1 2008/06/10 17:24:16 cbateman Exp $
+ */
+package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.util;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+
+import org.eclipse.emf.ecore.EObject;
+
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Adapter Factory</b> for the model.
+ * It provides an adapter <code>createXXX</code> method for each class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage
+ * @generated
+ */
+public class AddTagMDAdapterFactory extends AdapterFactoryImpl
+{
+    /**
+     * The cached model package.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected static AddTagMDPackage modelPackage;
+
+    /**
+     * Creates an instance of the adapter factory.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public AddTagMDAdapterFactory()
+    {
+        if (modelPackage == null)
+        {
+            modelPackage = AddTagMDPackage.eINSTANCE;
+        }
+    }
+
+    /**
+     * Returns whether this factory is applicable for the type of the object.
+     * <!-- begin-user-doc -->
+     * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
+     * <!-- end-user-doc -->
+     * @return whether this factory is applicable for the type of the object.
+     * @generated
+     */
+    @Override
+    public boolean isFactoryForType(Object object)
+    {
+        if (object == modelPackage)
+        {
+            return true;
+        }
+        if (object instanceof EObject)
+        {
+            return ((EObject)object).eClass().getEPackage() == modelPackage;
+        }
+        return false;
+    }
+
+    /**
+     * The switch that delegates to the <code>createXXX</code> methods.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected AddTagMDSwitch<Adapter> modelSwitch =
+        new AddTagMDSwitch<Adapter>()
+        {
+            @Override
+            public Adapter caseElementData(ElementData object)
+            {
+                return createElementDataAdapter();
+            }
+            @Override
+            public Adapter caseAttributeData(AttributeData object)
+            {
+                return createAttributeDataAdapter();
+            }
+            @Override
+            public Adapter defaultCase(EObject object)
+            {
+                return createEObjectAdapter();
+            }
+        };
+
+    /**
+     * Creates an adapter for the <code>target</code>.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @param target the object to adapt.
+     * @return the adapter for the <code>target</code>.
+     * @generated
+     */
+    @Override
+    public Adapter createAdapter(Notifier target)
+    {
+        return modelSwitch.doSwitch((EObject)target);
+    }
+
+
+    /**
+     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData <em>Element Data</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData
+     * @generated
+     */
+    public Adapter createElementDataAdapter()
+    {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData <em>Attribute Data</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData
+     * @generated
+     */
+    public Adapter createAttributeDataAdapter()
+    {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for the default case.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @generated
+     */
+    public Adapter createEObjectAdapter()
+    {
+        return null;
+    }
+
+} //AddTagMDAdapterFactory
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/util/AddTagMDSwitch.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/util/AddTagMDSwitch.java
new file mode 100644
index 0000000..8a10ba3
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/addtagmd/util/AddTagMDSwitch.java
@@ -0,0 +1,168 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: AddTagMDSwitch.java,v 1.1 2008/06/10 17:24:16 cbateman Exp $
+ */
+package org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.util;
+
+import java.util.List;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Switch</b> for the model's inheritance hierarchy.
+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
+ * to invoke the <code>caseXXX</code> method for each class of the model,
+ * starting with the actual class of the object
+ * and proceeding up the inheritance hierarchy
+ * until a non-null result is returned,
+ * which is the result of the switch.
+ * @param <T> 
+ * <!-- end-user-doc -->
+ * @see org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage
+ * @generated
+ */
+public class AddTagMDSwitch<T>
+{
+    /**
+     * The cached model package
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected static AddTagMDPackage modelPackage;
+
+    /**
+     * Creates an instance of the switch.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public AddTagMDSwitch()
+    {
+        if (modelPackage == null)
+        {
+            modelPackage = AddTagMDPackage.eINSTANCE;
+        }
+    }
+
+    /**
+     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+     * <!-- begin-user-doc -->
+     * @param theEObject 
+     * <!-- end-user-doc -->
+     * @return the first non-null result returned by a <code>caseXXX</code> call.
+     * @generated
+     */
+    public T doSwitch(EObject theEObject)
+    {
+        return doSwitch(theEObject.eClass(), theEObject);
+    }
+
+    /**
+     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+     * <!-- begin-user-doc -->
+     * @param theEClass 
+     * @param theEObject 
+     * <!-- end-user-doc -->
+     * @return the first non-null result returned by a <code>caseXXX</code> call.
+     * @generated
+     */
+    protected T doSwitch(EClass theEClass, EObject theEObject)
+    {
+        if (theEClass.eContainer() == modelPackage)
+        {
+            return doSwitch(theEClass.getClassifierID(), theEObject);
+        }
+        List<EClass> eSuperTypes = theEClass.getESuperTypes();
+        return
+            eSuperTypes.isEmpty() ?
+                defaultCase(theEObject) :
+                doSwitch(eSuperTypes.get(0), theEObject);
+    }
+
+    /**
+     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+     * <!-- begin-user-doc -->
+     * @param classifierID 
+     * @param theEObject 
+     * <!-- end-user-doc -->
+     * @return the first non-null result returned by a <code>caseXXX</code> call.
+     * @generated
+     */
+    protected T doSwitch(int classifierID, EObject theEObject)
+    {
+        switch (classifierID)
+        {
+            case AddTagMDPackage.ELEMENT_DATA:
+            {
+                ElementData elementData = (ElementData)theEObject;
+                T result = caseElementData(elementData);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case AddTagMDPackage.ATTRIBUTE_DATA:
+            {
+                AttributeData attributeData = (AttributeData)theEObject;
+                T result = caseAttributeData(attributeData);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            default: return defaultCase(theEObject);
+        }
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Element Data</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Element Data</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseElementData(ElementData object)
+    {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Attribute Data</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Attribute Data</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseAttributeData(AttributeData object)
+    {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch, but this is the last case anyway.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject)
+     * @generated
+     */
+    public T defaultCase(EObject object)
+    {
+        return null;
+    }
+
+} //AddTagMDSwitch
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/messages.properties b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/messages.properties
deleted file mode 100644
index 93983da..0000000
--- a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/messages.properties
+++ /dev/null
@@ -1,34 +0,0 @@
-MetadataTagInfo.BINDING_DESCRIPTION=A method binding of the form of the form \#{bean.binding} where 'binding' has the signature <b>UIComponent binding()</b>, that returns the component instance to use. If not present, Facelets will automatically instantiate one.
-MetadataTagInfo.COMPONENT_TAG_DESCRIPTION.1=Adds a new UIComponent into the view's component tree.  The new component will be the parent of the tag's component children.  Text outside the tag is removed before view rendering similar to composition.
-MetadataTagInfo.COMPONENT_TAG_DETAIL.1=<p><em>Inserts a composite component that ignores content around it:</em></p>
-MetadataTagInfo.COMPONENT_TAG_DETAIL.2=<br><p><i>This text will be removed</i><br>
-MetadataTagInfo.COMPONENT_TAG_DETAIL.3=<b>&lt;ui:composition&gt;</b><br>
-MetadataTagInfo.COMPONENT_TAG_DETAIL.4=\#{el.text}<br>
-MetadataTagInfo.COMPONENT_TAG_DETAIL.5=&lt;h:inputText &nbsp;value="\#{some.value}"/&gt;<br>
-MetadataTagInfo.COMPONENT_TAG_DETAIL.6=<b>&lt;/ui:composition&gt;</b><br>
-MetadataTagInfo.COMPONENT_TAG_DETAIL.7=<i>This text will be removed</i></p>
-MetadataTagInfo.DEBUG_TAG_DESCRIPTION.1=Saves the component tree and EL variables in a view.  Accessible by hitting the hotkey (CTRL-SHIFT-D by default).
-MetadataTagInfo.DEBUG_TAG_DETAIL.1=<p><em>Inserts a composite component that keeps the content around it:</em></p>
-MetadataTagInfo.DEBUG_TAG_DETAIL.2=<br><p><i>This text will be removed</i><br>
-MetadataTagInfo.DEBUG_TAG_DETAIL.3=<b>&lt;ui:composition&gt;</b><br>
-MetadataTagInfo.DEBUG_TAG_DETAIL.4=\#{el.text}<br>
-MetadataTagInfo.DEBUG_TAG_DETAIL.5=&lt;h:inputText &nbsp;value="\#{some.value}"/&gt;<br>
-MetadataTagInfo.DEBUG_TAG_DETAIL.6=<b>&lt;/ui:composition&gt;</b><br>
-MetadataTagInfo.DEBUG_TAG_DETAIL.7=<i>This text will be removed</i></p>
-MetadataTagInfo.DEFINE_NAME_DESCRIPTION=The name of a template area.  This name is referenced in instance documents using the insert tag
-MetadataTagInfo.DEFINE_TAG_DESCRIPTION.1=Defines a template area that can be used instances using insert.
-MetadataTagInfo.FRAGMENT_TAG_DESCRIPTION.1=Adds a new UIComponent into the view's component tree.  The new component will be the parent of the tag's component children.  Text outside the tag is kept, similar to decorate.
-MetadataTagInfo.HOTKEY_DESCRIPTION=The key in combination with CTRL-SHIFT to use to launch the debug viewer
-MetadataTagInfo.ID_DESCRIPTION=Assign a unique idea to generated component.  If not present, Facelets will automatically generate one.
-MetadataTagInfo.INCLUDE_TAG_DESCRIPTION.1=Includes another facelet.
-MetadataTagInfo.INSERT_NAME_DESCRIPTION=The name of a template area to insert (defined in the template using the define tag).  If not specified, the entire template will be inserted.
-MetadataTagInfo.INSERT_TAG_DESCRIPTION.1=Insert a named template area created using the define tag.
-MetadataTagInfo.PARAM_NAME_DESCRIPTION=The name of the new EL variable to declare
-MetadataTagInfo.PARAM_TAG_DESCRIPTION.1=Declares a new EL variable on the facelet page.
-MetadataTagInfo.PARAM_VALUE_DESCRIPTION=The literal or EL value to assign to the new variable
-MetadataTagInfo.REMOVE_TAG_DESCRIPTION.1=Removes its content from the rendered view.
-MetadataTagInfo.REPEAT_TAG_DESCRIPTION.1=Repeatedly renders its content by iterating through the List returned from the value attribute.  Intended as a JSF-safe replacement for c:forEach.
-MetadataTagInfo.REPEAT_VALUE_DESCRIPTION=The EL expression used to derive the list of items to repeat over
-MetadataTagInfo.REPEAT_VAR_DESCRIPTION=The name of the EL variable to use as the iterator
-MetadataTagInfo.SRC_DESCRIPTION=The path, absolute or relative to the original request, to another Facelet to include.  May be EL.  e.g. 'headerPage.xhtml'
-MetadataTagInfo.TEMPLATE_DESCRIPTION=A uri that points to the template to use.  e.g. /WEB-INF/templates/mytemplate.xhtml
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/AbstractExternalMetadataStrategy.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/AbstractExternalMetadataStrategy.java
new file mode 100644
index 0000000..e579240
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/AbstractExternalMetadataStrategy.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Oracle Corporation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Cameron Bateman - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jsf.facelet.core.internal.cm.strategy;
+
+import org.eclipse.jst.jsf.common.dom.TagIdentifier;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.ExternalTagInfo;
+
+/**
+ * Super class of all external meta-data strategy.
+ * 
+ * @author cbateman
+ * 
+ */
+/* package */abstract class AbstractExternalMetadataStrategy implements
+IExternalMetadataStrategy
+{
+    private final String _displayName;
+    private final String _id;
+
+    protected AbstractExternalMetadataStrategy(final String id,
+            final String displayName)
+    {
+        _id = id;
+        _displayName = displayName;
+    }
+
+    public final ExternalTagInfo getNoResult()
+    {
+        // this value must be "==" comparable
+        return ExternalTagInfo.NULL_INSTANCE;
+    }
+
+    public abstract ExternalTagInfo perform(TagIdentifier input) throws Exception;
+
+    public final String getDisplayName()
+    {
+        return _displayName;
+    }
+
+    public String getId()
+    {
+        return _id;
+    }
+}
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/IExternalMetadataStrategy.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/IExternalMetadataStrategy.java
new file mode 100644
index 0000000..763c2b6
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/IExternalMetadataStrategy.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Oracle Corporation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Cameron Bateman - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jsf.facelet.core.internal.cm.strategy;
+
+import org.eclipse.jst.jsf.common.dom.TagIdentifier;
+import org.eclipse.jst.jsf.common.internal.strategy.IIdentifiableStrategy;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.ExternalTagInfo;
+
+/**
+ * A strategy whose algorithm loads the tag CM data for a tag.
+ * 
+ * @author cbateman
+ * 
+ */
+public interface IExternalMetadataStrategy extends
+        IIdentifiableStrategy<TagIdentifier, ExternalTagInfo, String>
+{
+    
+    /**
+     * A null strategy that returns no result for all queries
+     * @author cbateman
+     *
+     */
+    static class NullExternalMetadataStrategy implements IExternalMetadataStrategy
+    {
+
+        public ExternalTagInfo getNoResult()
+        {
+            return ExternalTagInfo.NULL_INSTANCE;
+        }
+
+        public ExternalTagInfo perform(TagIdentifier input) throws Exception
+        {
+            return getNoResult();
+        }
+
+        public String getDisplayName()
+        {
+            return "NULL instance; you shouldn't see this label!"; //$NON-NLS-1$
+        }
+
+        public String getId()
+        {
+            return "NULL Strategy"; //$NON-NLS-1$
+        }
+        
+    }
+}
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/JSPExternalMetadataStrategy.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/JSPExternalMetadataStrategy.java
new file mode 100644
index 0000000..fc00a4b
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/JSPExternalMetadataStrategy.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Oracle Corporation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Cameron Bateman - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jsf.facelet.core.internal.cm.strategy;
+
+import org.eclipse.jst.jsf.common.dom.TagIdentifier;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.ExternalTagInfo;
+import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+
+/**
+ * A metadata strategy that uses JSP TLD metadata.
+ * 
+ * @author cbateman
+ * 
+ */
+public class JSPExternalMetadataStrategy extends
+        AbstractExternalMetadataStrategy
+{
+    private final TLDDocument  _doc;
+    /**
+     * The unique identifier for the strategy.
+     */
+    public final static String STRATEGY_ID = "org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.JSPExternalMetadataStrategy"; //$NON-NLS-1$
+
+    /**
+     * @param doc 
+     */
+    public JSPExternalMetadataStrategy(final TLDDocument doc)
+    {
+        super(STRATEGY_ID, Messages.JSPExternalMetadataStrategy_DisplayName);
+        _doc = doc;
+    }
+
+    @Override
+    public ExternalTagInfo perform(final TagIdentifier input) throws Exception
+    {
+        if (_doc != null)
+        {
+            return new TLDMetadataExternalInfo(_doc);
+        }
+        return getNoResult();
+    }
+
+    private static class TLDMetadataExternalInfo extends ExternalTagInfo
+    {
+        private final TLDDocument _doc;
+
+        public TLDMetadataExternalInfo(final TLDDocument doc)
+        {
+            _doc = doc;
+        }
+
+        @Override
+        public CMNamedNodeMap getAttributes(final String tagName)
+        {
+            final CMElementDeclaration element = (CMElementDeclaration) _doc
+                    .getElements().getNamedItem(tagName);
+
+            if (element != null)
+            {
+                return element.getAttributes();
+            }
+            return null;
+        }
+
+        @Override
+        public Object getTagProperty(final String tagName, final String key)
+        {
+            final CMElementDeclaration element = (CMElementDeclaration) _doc
+                    .getElements().getNamedItem(tagName);
+            if (element != null)
+            {
+                return element.getProperty(key);
+            }
+            return null;
+        }
+    }
+}
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/MDExternalMetadataStrategy.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/MDExternalMetadataStrategy.java
new file mode 100644
index 0000000..eae20b7
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/MDExternalMetadataStrategy.java
@@ -0,0 +1,403 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Oracle Corporation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Cameron Bateman - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jsf.facelet.core.internal.cm.strategy;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+import org.eclipse.jface.util.SafeRunnable;
+import org.eclipse.jst.jsf.common.dom.TagIdentifier;
+import org.eclipse.jst.jsf.common.internal.managedobject.IManagedObject;
+import org.eclipse.jst.jsf.common.internal.managedobject.ObjectManager.ManagedObjectException;
+import org.eclipse.jst.jsf.common.internal.resource.ResourceSingletonObjectManager;
+import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.AttributeCMAdapter;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.ExternalTagInfo;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AttributeData;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.provider.IResourceProvider;
+import org.eclipse.jst.jsf.facelet.core.internal.util.TagMetadataLoader;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
+import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+
+/**
+ * An external meta-data strategy that uses the JSF meta-data framework.
+ * 
+ * @author cbateman
+ * 
+ */
+public class MDExternalMetadataStrategy extends
+        AbstractExternalMetadataStrategy implements IManagedObject
+{
+    private static MySingletonManager   MANAGER = new MySingletonManager();
+    
+    /**
+     * @param project
+     * @return the instance of the strategy for project or 
+     */
+    public static IExternalMetadataStrategy create(final IProject project)
+    {
+        try
+        {
+            return MANAGER.getInstance(project);
+        }
+        catch (ManagedObjectException e)
+        {
+            FaceletCorePlugin.log("Getting managed instance of tag metadata strategy", e); //$NON-NLS-1$
+        }
+        return new NullExternalMetadataStrategy();
+    }
+
+    /**
+     * The unique identifier for the strategy.
+     */
+    public final static String      STRATEGY_ID = "org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.MDExternalMetadataStrategy"; //$NON-NLS-1$
+
+    //    private static final String     VAR         = "var";                                                  //$NON-NLS-1$
+    //    private static final String     VALUE       = "value";                                                //$NON-NLS-1$
+    //    private static final String     SRC         = "src";                                                  //$NON-NLS-1$
+    //    private static final String     NAME        = "name";                                                 //$NON-NLS-1$
+    //    private static final String     HOTKEY      = "hotkey";                                               //$NON-NLS-1$
+    //    private static final String     TEMPLATE    = "template";                                             //$NON-NLS-1$
+    //    private static final String     BINDING     = "binding";                                              //$NON-NLS-1$
+    //    private static final String     ID          = "id";                                                   //$NON-NLS-1$
+
+    private final IProject          _project;
+    private final TagMetadataLoader _tagMetadataLoader;
+    private final Map<String, MDExternalTagInfo>    _cached;
+    private final AtomicBoolean     _isDisposed = new AtomicBoolean(false);
+
+    /**
+     * Default constructor
+     * 
+     * @param project
+     */
+    private MDExternalMetadataStrategy(final IProject project)
+    {
+        super(STRATEGY_ID, Messages.MDExternalMetadataStrategy_DisplayName);
+        _project = project;
+        _tagMetadataLoader = new TagMetadataLoader(_project);
+        _cached = new HashMap<String, MDExternalTagInfo>();
+    }
+
+    public void checkpoint()
+    {
+        // do nothing
+    }
+
+    public void destroy()
+    {
+        // currently no persistent state, so just dispose
+    }
+
+    public void dispose()
+    {
+        if (_isDisposed.compareAndSet(false, true))
+        {
+            _cached.clear();
+        }
+    }
+    
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.
+     * AbstractExternalMetadataStrategy
+     * #perform(org.eclipse.jst.jsf.common.dom.TagIdentifier)
+     */
+    @Override
+    public ExternalTagInfo perform(final TagIdentifier input) throws Exception
+    {
+        MDExternalTagInfo tagInfo = _cached.get(input.getUri());
+        
+        if (tagInfo == null)
+        {
+            tagInfo =  new MDExternalTagInfo(input.getUri(), _tagMetadataLoader);
+            _cached.put(input.getUri(), tagInfo);
+        }
+        return tagInfo;
+    }
+
+    private static class MDExternalTagInfo extends ExternalTagInfo
+    {
+        private final String                            _uri;
+        private final TagMetadataLoader                 _tagMetadataLoader;
+        private final Map<String, InternalNamedNodeMap> _attributes;
+
+        public MDExternalTagInfo(final String uri,
+                final TagMetadataLoader tagMetadataLoader)
+        {
+            _uri = uri;
+            _tagMetadataLoader = tagMetadataLoader;
+            _attributes = new HashMap<String, InternalNamedNodeMap>();
+        }
+
+        @Override
+        public CMNamedNodeMap getAttributes(final String tagName)
+        {
+            InternalNamedNodeMap nodeMap = _attributes.get(tagName);
+            final InternalNamedNodeMap[]  innerClassNodeMap = new InternalNamedNodeMap[1];
+            innerClassNodeMap[0] = nodeMap;
+
+            if (nodeMap == null)
+            {
+                SafeRunnable.run(new ISafeRunnable()
+                {
+                    public void run()
+                    {
+                        final ElementData data = _tagMetadataLoader.getElementData(
+                                _uri, tagName);
+        
+                        if (data != null)
+                        {
+                            innerClassNodeMap[0] = new InternalNamedNodeMap();
+        
+                            for (final AttributeData attribute : data.getAttributes())
+                            {
+                                innerClassNodeMap[0].add(createAttribute(attribute));
+                            }
+                            _attributes.put(tagName, innerClassNodeMap[0]);
+                        }
+                    }
+
+                    public void handleException(Throwable exception)
+                    {
+                        FaceletCorePlugin.log("While loading attribute meta-data", exception); //$NON-NLS-1$
+                    }
+                });
+            }
+
+            return innerClassNodeMap[0];
+        }
+
+        @Override
+        public Object getTagProperty(final String tagName, final String key)
+        {
+            final Object[] value = new Object[1];
+            value[0] = null;
+            
+            SafeRunnable.run(new ISafeRunnable()
+            {
+                public void run()
+                {
+                    if ("description".equals(key)) //$NON-NLS-1$
+                    {
+                        value[0] = _tagMetadataLoader.getDescription(_uri, tagName);
+                    }
+                }
+
+                public void handleException(Throwable exception)
+                {
+                    FaceletCorePlugin.log("While loading tag property meta-data", exception); //$NON-NLS-1$
+                }
+            });
+            return value[0];
+        }
+    }
+
+    private static class InternalNamedNodeMap implements CMNamedNodeMap
+    {
+        private final List<CMNode> _nodes = new ArrayList<CMNode>();
+
+        public void add(final CMNode node)
+        {
+            _nodes.add(node);
+        }
+
+        public int getLength()
+        {
+            return _nodes.size();
+        }
+
+        public CMNode getNamedItem(final String name)
+        {
+            for (final CMNode foundNode : _nodes)
+            {
+                if (name.equals(foundNode.getNodeName()))
+                {
+                    return foundNode;
+                }
+            }
+            return null;
+        }
+
+        public CMNode item(final int index)
+        {
+            if (index < _nodes.size())
+            {
+                return _nodes.get(index);
+            }
+            return null;
+        }
+
+        public Iterator<?> iterator()
+        {
+            return Collections.unmodifiableList(_nodes).iterator();
+        }
+    }
+
+    // temporary: transfer out to metadata
+    final static Map<String, InternalNamedNodeMap> _faceletData;
+
+    static
+    {
+        // final String ID_DESCRIPTION =
+        // Messages.MDExternalMetadataStrategy_ID_DESCRIPTION;
+        // final String BINDING_DESCRIPTION =
+        // Messages.MDExternalMetadataStrategy_BINDING_DESCRIPTION;
+        // final String TEMPLATE_DESCRIPTION =
+        // Messages.MDExternalMetadataStrategy_TEMPLATE_DESCRIPTION;
+        // final String HOTKEY_DESCRIPTION =
+        // Messages.MDExternalMetadataStrategy_HOTKEY_DESCRIPTION;
+        // final String DEFINE_NAME_DESCRIPTION =
+        // Messages.MDExternalMetadataStrategy_DEFINE_NAME_DESCRIPTION;
+        // final String SRC_DESCRIPTION =
+        // Messages.MDExternalMetadataStrategy_SRC_DESCRIPTION;
+        // final String INSERT_NAME_DESCRIPTION =
+        // Messages.MDExternalMetadataStrategy_INSERT_NAME_DESCRIPTION;
+        // final String PARAM_NAME_DESCRIPTION =
+        // Messages.MDExternalMetadataStrategy_PARAM_NAME_DESCRIPTION;
+        // final String PARAM_VALUE_DESCRIPTION =
+        // Messages.MDExternalMetadataStrategy_PARAM_VALUE_DESCRIPTION;
+        // final String REPEAT_VAR_DESCRIPTION =
+        // Messages.MDExternalMetadataStrategy_REPEAT_VAR_DESCRIPTION;
+        // final String REPEAT_VALUE_DESCRIPTION =
+        // Messages.MDExternalMetadataStrategy_REPEAT_VALUE_DESCRIPTION;
+
+        final Map<String, InternalNamedNodeMap> map = new HashMap<String, InternalNamedNodeMap>();
+        // component
+        // InternalNamedNodeMap nodeMap = new InternalNamedNodeMap();
+        // nodeMap.add(createAttribute(ID, CMAttributeDeclaration.OPTIONAL,
+        // ID_DESCRIPTION));
+        // nodeMap.add(createAttribute(BINDING, CMAttributeDeclaration.OPTIONAL,
+        // BINDING_DESCRIPTION));
+        // map.put(IFaceletTagConstants.TAG_COMPONENT, nodeMap);
+        //
+        // // composition
+        // nodeMap = new InternalNamedNodeMap();
+        // nodeMap.add(createAttribute(TEMPLATE,
+        // CMAttributeDeclaration.OPTIONAL,
+        // TEMPLATE_DESCRIPTION));
+        // map.put(IFaceletTagConstants.TAG_COMPOSITION, nodeMap);
+
+        // debug
+        // nodeMap = new InternalNamedNodeMap();
+        // nodeMap.add(createAttribute(HOTKEY, CMAttributeDeclaration.OPTIONAL,
+        // HOTKEY_DESCRIPTION));
+        // map.put(IFaceletTagConstants.TAG_DEBUG, nodeMap);
+
+        // decorate
+        // nodeMap = new InternalNamedNodeMap();
+        // nodeMap.add(createAttribute(TEMPLATE,
+        // CMAttributeDeclaration.REQUIRED,
+        // TEMPLATE_DESCRIPTION));
+        // map.put(IFaceletTagConstants.TAG_DECORATE, nodeMap);
+
+        // define
+        // nodeMap = new InternalNamedNodeMap();
+        // nodeMap.add(createAttribute(NAME, CMAttributeDeclaration.REQUIRED,
+        // DEFINE_NAME_DESCRIPTION));
+        // map.put(IFaceletTagConstants.TAG_DEFINE, nodeMap);
+
+        // fragment
+        // nodeMap = new InternalNamedNodeMap();
+        // nodeMap.add(createAttribute(ID, CMAttributeDeclaration.OPTIONAL,
+        // ID_DESCRIPTION));
+        // nodeMap.add(createAttribute(BINDING, CMAttributeDeclaration.OPTIONAL,
+        // BINDING_DESCRIPTION));
+        // map.put(IFaceletTagConstants.TAG_FRAGMENT, nodeMap);
+
+        // include
+        // nodeMap = new InternalNamedNodeMap();
+        // nodeMap.add(createAttribute(SRC, CMAttributeDeclaration.REQUIRED,
+        // SRC_DESCRIPTION));
+        // map.put(IFaceletTagConstants.TAG_INCLUDE, nodeMap);
+
+        // insert
+        // nodeMap = new InternalNamedNodeMap();
+        // nodeMap.add(createAttribute(NAME, CMAttributeDeclaration.OPTIONAL,
+        // INSERT_NAME_DESCRIPTION));
+        // map.put(IFaceletTagConstants.TAG_INSERT, nodeMap);
+
+        // param
+        // nodeMap = new InternalNamedNodeMap();
+        // nodeMap.add(createAttribute(NAME, CMAttributeDeclaration.REQUIRED,
+        // PARAM_NAME_DESCRIPTION));
+        // nodeMap.add(createAttribute(VALUE, CMAttributeDeclaration.REQUIRED,
+        // PARAM_VALUE_DESCRIPTION));
+        // map.put(IFaceletTagConstants.TAG_PARAM, nodeMap);
+
+        // remove
+        // nodeMap = new InternalNamedNodeMap();
+        // // no attributes
+        // map.put(IFaceletTagConstants.TAG_PARAM, nodeMap);
+
+        // repeat
+        // nodeMap = new InternalNamedNodeMap();
+        // nodeMap.add(createAttribute(VALUE, CMAttributeDeclaration.REQUIRED,
+        // REPEAT_VALUE_DESCRIPTION));
+        // nodeMap.add(createAttribute(VAR, CMAttributeDeclaration.REQUIRED,
+        // REPEAT_VAR_DESCRIPTION));
+        // map.put(IFaceletTagConstants.TAG_REPEAT, nodeMap);
+
+        _faceletData = Collections.unmodifiableMap(map);
+    }
+
+    private static CMAttributeDeclaration createAttribute(
+            final AttributeData attributeData)
+    {
+        final AttributeCMAdapter attribute = new AttributeCMAdapter(
+                attributeData.getName(), attributeData.getUsage().getValue());
+
+        final ComposedAdapterFactory factory = new ComposedAdapterFactory(
+                ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
+
+        final Object provider = factory.adapt(attributeData,
+                IResourceProvider.class);
+
+        // get the description from meta-data and feed through the provider
+        // for possible translation
+        String description = attributeData.getDescription();
+
+        if (provider instanceof IResourceProvider)
+        {
+            final IResourceProvider resProvider = (IResourceProvider) provider;
+            final String translated = resProvider.getTranslatedString(
+                    attributeData, AddTagMDPackage.eINSTANCE
+                            .getAttributeData_Description());
+            description = translated != null ? translated : description;
+        }
+        
+        attribute.setDescription(description);
+        return attribute;
+    }
+    
+    private static class MySingletonManager extends ResourceSingletonObjectManager<MDExternalMetadataStrategy, IProject>
+    {
+
+        @Override
+        protected MDExternalMetadataStrategy createNewInstance(IProject resource)
+        {
+            return new MDExternalMetadataStrategy(resource);
+        }
+
+    }
+}
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/Messages.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/Messages.java
new file mode 100644
index 0000000..8105851
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/Messages.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Oracle Corporation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Cameron Bateman - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jsf.facelet.core.internal.cm.strategy;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * 
+ * @author cbateman
+ *
+ */
+/*package*/ class Messages extends NLS
+{
+    private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.messages"; //$NON-NLS-1$
+
+
+    public static String JSPExternalMetadataStrategy_DisplayName;
+
+
+    /**
+     * Display name for MDExternalMetadataStrategy
+     */
+    public static String        MDExternalMetadataStrategy_DisplayName;
+    
+    public static String        MDExternalMetadataStrategy_BINDING_DESCRIPTION;
+    public static String        MDExternalMetadataStrategy_DEFINE_NAME_DESCRIPTION;
+    public static String        MDExternalMetadataStrategy_HOTKEY_DESCRIPTION;
+    public static String        MDExternalMetadataStrategy_ID_DESCRIPTION;
+    public static String        MDExternalMetadataStrategy_INSERT_NAME_DESCRIPTION;
+    public static String        MDExternalMetadataStrategy_PARAM_NAME_DESCRIPTION;
+    public static String        MDExternalMetadataStrategy_PARAM_VALUE_DESCRIPTION;
+    public static String        MDExternalMetadataStrategy_REPEAT_VALUE_DESCRIPTION;
+    public static String        MDExternalMetadataStrategy_REPEAT_VAR_DESCRIPTION;
+    public static String        MDExternalMetadataStrategy_SRC_DESCRIPTION;
+    public static String        MDExternalMetadataStrategy_TEMPLATE_DESCRIPTION;
+
+
+    static
+    {
+        // initialize resource bundle
+        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+    }
+
+    private Messages()
+    {
+        // no external instantiation
+    }
+}
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/TagInfoStrategyComposite.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/TagInfoStrategyComposite.java
new file mode 100644
index 0000000..1a018e3
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/TagInfoStrategyComposite.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Oracle Corporation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Cameron Bateman - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jsf.facelet.core.internal.cm.strategy;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.eclipse.jst.jsf.common.dom.TagIdentifier;
+import org.eclipse.jst.jsf.common.internal.policy.IdentifierOrderedIteratorPolicy;
+import org.eclipse.jst.jsf.common.internal.strategy.IteratorPolicyBasedStrategyComposite;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.ExternalTagInfo;
+
+/**
+ * A composite of strategies for deriving external tag metadata.
+ * 
+ * @author cbateman
+ * 
+ */
+public class TagInfoStrategyComposite
+        extends
+        IteratorPolicyBasedStrategyComposite<TagIdentifier, ExternalTagInfo, String, IExternalMetadataStrategy>
+{
+    private final Iterable<String> _policyOrder;
+
+    /**
+     * @param policyOrder
+     */
+    public TagInfoStrategyComposite(final Iterable<String> policyOrder)
+    {
+        super(new MyIteratorPolicy(policyOrder));
+        _policyOrder = policyOrder;
+    }
+
+    @Override
+    public ExternalTagInfo getNoResult()
+    {
+        return ExternalTagInfo.NULL_INSTANCE;
+    }
+
+    /**
+     * 
+     */
+    public void resetIterator()
+    {
+        setPolicy(new MyIteratorPolicy(_policyOrder));
+    }
+
+    private static class MyIteratorPolicy extends
+            IdentifierOrderedIteratorPolicy<String>
+    {
+        private Iterator<String> _iterator;
+
+        public MyIteratorPolicy(final Iterable<String> policyOrder)
+        {
+            super(policyOrder);
+            setExcludeNonExplicitValues(true);
+        }
+
+        @Override
+        public Iterator<String> getIterator(
+                final Collection<String> forCollection)
+        {
+            if (_iterator == null)
+            {
+                _iterator = super.getIterator(forCollection);
+            }
+            return _iterator;
+        }
+    }
+}
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/messages.properties b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/messages.properties
new file mode 100644
index 0000000..8cbba25
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/cm/strategy/messages.properties
@@ -0,0 +1,13 @@
+JSPExternalMetadataStrategy_DisplayName=JSP TLD meta-data
+MDExternalMetadataStrategy_DisplayName=Tag meta-data from MD framework
+MDExternalMetadataStrategy_BINDING_DESCRIPTION=A method binding of the form of the form \#{bean.binding} where 'binding' has the signature <b>UIComponent binding()</b>, that returns the component instance to use. If not present, Facelets will automatically instantiate one.
+MDExternalMetadataStrategy_DEFINE_NAME_DESCRIPTION=The name of a template area.  This name is referenced in instance documents using the insert tag
+MDExternalMetadataStrategy_HOTKEY_DESCRIPTION=The key in combination with CTRL-SHIFT to use to launch the debug viewer
+MDExternalMetadataStrategy_ID_DESCRIPTION=Assign a unique idea to generated component.  If not present, Facelets will automatically generate one.
+MDExternalMetadataStrategy_INSERT_NAME_DESCRIPTION=The name of a template area to insert (defined in the template using the define tag).  If not specified, the entire template will be inserted.
+MDExternalMetadataStrategy_PARAM_NAME_DESCRIPTION=The name of the new EL variable to declare
+MDExternalMetadataStrategy_PARAM_VALUE_DESCRIPTION=The literal or EL value to assign to the new variable
+MDExternalMetadataStrategy_REPEAT_VALUE_DESCRIPTION=The EL expression used to derive the list of items to repeat over
+MDExternalMetadataStrategy_REPEAT_VAR_DESCRIPTION=The name of the EL variable to use as the iterator
+MDExternalMetadataStrategy_SRC_DESCRIPTION=The path, absolute or relative to the original request, to another Facelet to include.  May be EL.  e.g. 'headerPage.xhtml'
+MDExternalMetadataStrategy_TEMPLATE_DESCRIPTION=A uri that points to the template to use.  e.g. /WEB-INF/templates/mytemplate.xhtml
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/FaceletTaglib.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/FaceletTaglib.java
index 2813ea3..532dd0f 100644
--- a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/FaceletTaglib.java
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/FaceletTaglib.java
@@ -1,7 +1,6 @@
 package org.eclipse.jst.jsf.facelet.core.internal.tagmodel;
 
 import java.util.Collection;
-import java.util.Map;
 
 import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
 
@@ -55,11 +54,6 @@
      */
     public abstract String getLibraryTypeDescription();
 
-    /**
-     * @return a map of tags indexed by name. Map should be regarded as
-     *         unmodifiable and may throw exceptions on modification
-     */
-    public abstract Map<String, ITagElement> getTags();
 
     @Override
     public abstract ITagElement getViewElement(String name);
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/FaceletTaglibWithLibraryClass.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/FaceletTaglibWithLibraryClass.java
index ba706ec..a0453de 100644
--- a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/FaceletTaglibWithLibraryClass.java
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/FaceletTaglibWithLibraryClass.java
@@ -7,7 +7,6 @@
 
 import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
 
-
 /**
  * A facelet tag library using only a library class to specify its runtime
  * tag/component mappings
@@ -20,9 +19,9 @@
     /**
      * 
      */
-    private static final long serialVersionUID = -7747289728027784505L;
-    private final String                    _libraryClassName;
-    private final Map<String, ITagElement>   _tags;
+    private static final long              serialVersionUID = -7747289728027784505L;
+    private final String                   _libraryClassName;
+    private final Map<String, ITagElement> _tags;
 
     /**
      * @param namespace
@@ -30,14 +29,14 @@
      * @param tags
      */
     public FaceletTaglibWithLibraryClass(final String namespace,
-            final String libraryClassName,
-            final Map<String, ITagElement> tags) {
+            final String libraryClassName, final Map<String, ITagElement> tags)
+    {
         super(namespace);
         _libraryClassName = libraryClassName;
 
         if (tags == null)
         {
-            _tags =  Collections.emptyMap();
+            _tags = Collections.emptyMap();
         }
         else
         {
@@ -49,8 +48,9 @@
      * @param copyMe
      * @param namespace
      */
-    public FaceletTaglibWithLibraryClass(final FaceletTaglibWithLibraryClass copyMe,
-            final String namespace) {
+    public FaceletTaglibWithLibraryClass(
+            final FaceletTaglibWithLibraryClass copyMe, final String namespace)
+    {
         super(namespace);
         _libraryClassName = copyMe._libraryClassName;
         _tags = new HashMap<String, ITagElement>(copyMe._tags);
@@ -59,34 +59,34 @@
     /**
      * @return the library class name
      */
-    public final String getLibraryClassName() {
+    public final String getLibraryClassName()
+    {
         return _libraryClassName;
     }
 
     @Override
-    public String toString() {
+    public String toString()
+    {
         String toString = super.toString();
         toString += "Library Class Name: " + _libraryClassName + "\n"; //$NON-NLS-1$ //$NON-NLS-2$
         return toString;
     }
 
     @Override
-    public String getLibraryTypeDescription() {
+    public String getLibraryTypeDescription()
+    {
         return Messages.FaceletTaglibWithLibraryClass_TAG_LIBRARY_TYPE_DESCRIPTION;
     }
 
     @Override
-    public Map<String, ITagElement> getTags() {
-        return Collections.unmodifiableMap(_tags);
-    }
-
-    @Override
-    public String getDisplayName() {
+    public String getDisplayName()
+    {
         return (getNSUri() != null ? getNSUri() : _libraryClassName);
     }
 
     @Override
-    public Collection<? extends ITagElement> getViewElements() {
+    public Collection<? extends ITagElement> getViewElements()
+    {
         return _tags.values();
     }
 
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/FaceletTaglibWithTags.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/FaceletTaglibWithTags.java
index b9b2754..260b2cd 100644
--- a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/FaceletTaglibWithTags.java
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/tagmodel/FaceletTaglibWithTags.java
@@ -1,6 +1,7 @@
 package org.eclipse.jst.jsf.facelet.core.internal.tagmodel;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -18,6 +19,7 @@
      */
     private static final long serialVersionUID = 5754003734420972494L;
     private final Map<String, ITagElement> _tags;
+    private boolean                        _isInitialized; // = false
 
     /**
      * @param namespace
@@ -29,22 +31,11 @@
         _tags = tags;
     }
 
-    @Override
-    public Map<String, ITagElement> getTags()
-    {
-        return internalGetTags();
-    }
-
     private void addFaceletTag(final String name, final FaceletTag tag)
     {
         _tags.put(name, tag);
     }
 
-    private Map<String, ITagElement> internalGetTags()
-    {
-        return _tags;
-    }
-
     static class WorkingCopy extends FaceletTaglibWithTags
     {
         /**
@@ -63,13 +54,14 @@
 
         public FaceletTaglibWithTags closeWorkingCopy()
         {
+            setInitialized();
             return this;
         }
 
-        public FaceletTaglibWithTags shallowCopy()
-        {
-            return new FaceletTaglibWithTags(getNSUri(), super.internalGetTags());
-        }
+//        public FaceletTaglibWithTags shallowCopy()
+//        {
+//            return new FaceletTaglibWithTags(getNSUri(), super.internalGetTags());
+//        }
     }
 
     @Override
@@ -77,7 +69,7 @@
     {
         String toString =  super.toString();
 
-        for (final ITagElement tag : getTags().values())
+        for (final ITagElement tag : getViewElements())
         {
             toString += tag.toString();
         }
@@ -98,29 +90,37 @@
     }
 
     @Override
-    public Collection<ITagElement> getViewElements() {
-        // TODO Auto-generated method stub
-        return null;
+    public Collection<? extends ITagElement> getViewElements() {
+        return Collections.unmodifiableCollection(_tags.values());
     }
 
     @Override
     public ITagElement getViewElement(String name)
     {
-        //TODO:
-        throw new UnsupportedOperationException();
+        return _tags.get(name);
     }
 
     @Override
     public boolean hasViewElements()
     {
-      //TODO:
-        throw new UnsupportedOperationException();
+        return !_tags.isEmpty();
     }
 
     @Override
     public boolean isInitialized()
     {
-      //TODO:
-        throw new UnsupportedOperationException();
+        return _isInitialized;
+    }
+    
+    /**
+     * 
+     */
+    protected final void setInitialized()
+    {
+        //latch only 
+        if (!_isInitialized)
+        {
+            _isInitialized = true;
+        }
     }
 }
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/util/TagMetadataLoader.java b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/util/TagMetadataLoader.java
new file mode 100644
index 0000000..e4425db
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.core/src/org/eclipse/jst/jsf/facelet/core/internal/util/TagMetadataLoader.java
@@ -0,0 +1,162 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Oracle Corporation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Cameron Bateman - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jsf.facelet.core.internal.util;
+
+import java.util.Iterator;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.jst.jsf.common.metadata.Entity;
+import org.eclipse.jst.jsf.common.metadata.Model;
+import org.eclipse.jst.jsf.common.metadata.Trait;
+import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
+import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
+import org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.ElementData;
+import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo;
+import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos;
+
+/**
+ * Loads tag meta-data.
+ * 
+ * @author cbateman
+ * 
+ */
+public class TagMetadataLoader
+{
+    private static final String PALETTE_INFOS      = "paletteInfos"; //$NON-NLS-1$
+
+    private static final String TRAIT_DISPLAY_NAME = "displayName"; //$NON-NLS-1$
+
+    private static final String TRAIT_DESCRIPTION  = "description"; //$NON-NLS-1$
+
+    private static final String TRAIT_ADDITIONALELEMENTDATA = "additionalElementData"; //$NON-NLS-1$
+    
+    private final IProject      _project;
+
+    /**
+     * @param project
+     */
+    public TagMetadataLoader(final IProject project)
+    {
+        _project = project;
+    }
+
+    /**
+     * @param nsUri
+     * @param tagName
+     * @return the display name for tagName or null if not found.
+     */
+    public String getDisplayName(final String nsUri, final String tagName)
+    {
+        return getString(nsUri, tagName, TRAIT_DISPLAY_NAME);
+    }
+
+    /**
+     * @param nsUri
+     * @param tagName
+     * @return the description for tagName or null if not found.
+     */
+    public String getDescription(final String nsUri, final String tagName)
+    {
+        return getString(nsUri, tagName, TRAIT_DESCRIPTION);
+    }
+
+    /**
+     * @param nsUri
+     * @param tagName
+     * @return attribute data identified by the name or null.
+     */
+    public ElementData getElementData(final String nsUri,
+            final String tagName)
+    {
+        final ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper
+                .createMetaDataModelContext(_project, nsUri);
+
+        final Entity entity = TaglibDomainMetaDataQueryHelper.getEntity(
+                modelContext, tagName);
+
+        if (entity != null)
+        {
+            Trait trait = 
+                TaglibDomainMetaDataQueryHelper.getTrait(entity, TRAIT_ADDITIONALELEMENTDATA);
+            if (trait != null)
+            {
+                EObject value= trait.getValue();
+                if (value instanceof ElementData)
+                {
+                    return (ElementData) value;
+                }
+            }
+        }
+        return null;
+    }
+
+    private String getString(final String nsUri, final String tagName,
+            final String key)
+    {
+        String value = null;
+        final Model model = getModel(nsUri);
+        if (model != null)
+        {
+            value = getString(key, model, tagName);
+        }
+        return value;
+    }
+
+    private String getString(final String key, final Model model,
+            final String tagName)
+    {
+        String value = null;
+
+        // use palette infos if available
+        final Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model,
+                PALETTE_INFOS);
+        if (trait != null)
+        {
+            final PaletteInfos tags = (PaletteInfos) trait.getValue();
+            for (final Iterator it = tags.getInfos().iterator(); it.hasNext();)
+            {
+                final PaletteInfo tag = (PaletteInfo) it.next();
+                if (tag.getId().equalsIgnoreCase(tagName))
+                {
+                    final EStructuralFeature feature = tag.eClass()
+                            .getEStructuralFeature(key);
+                    if (feature != null)
+                    {
+                        if (tag.eIsSet(feature))
+                        {
+                            final Object strValue = tag.eGet(feature);
+                            if (strValue instanceof String)
+                            {
+                                value = (String) strValue;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return value;
+    }
+
+    private Model getModel(final String nsUri)
+    {
+        final ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper
+                .createMetaDataModelContext(_project, nsUri);
+        final Model model = TaglibDomainMetaDataQueryHelper
+                .getModel(modelContext);
+        // no caching at this time so there is no need to listen to model
+        // notifications
+        // if (model != null && !hasAdapter(model))
+        // addAdapter(model);
+        return model;
+    }
+}
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.ui/plugin.xml b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.ui/plugin.xml
index 54fbb78..a1b2ab0 100644
--- a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.ui/plugin.xml
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.ui/plugin.xml
@@ -87,6 +87,13 @@
          </page>
       </wizard-pages>
    </extension>
+   <extension
+         point="org.eclipse.ui.editors.templates">
+      <include
+            file="templates/templates.xml"
+            translations="$nl$/templates/templates.properties">
+      </include>
+   </extension>
    <!--<extension
          point="org.eclipse.wst.xml.core.modelQueryExtensions">
       <modelQueryExtension
@@ -94,6 +101,4 @@
             contentType="org.eclipse.wst.html.core.htmlsource">
       </modelQueryExtension>
    </extension>-->
-
-
 </plugin>
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.ui/templates/templates.properties b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.ui/templates/templates.properties
new file mode 100644
index 0000000..df94639
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.ui/templates/templates.properties
@@ -0,0 +1,11 @@
+New_Footer=New Facelet Footer
+New_Footer_Description=Create a simple footer.
+
+New_Facelet_Header=New Facelet Header
+New_Facelet_Header_Description=Creates a new header for use with the simple facelet template
+
+New_Facelet_Template=New Facelet Template
+New_Facelet_Template_Description=Creates a basic header/content/footer template
+
+New_Simple_Facelet_Composition_Page=New Facelet Composition Page
+New_Simple_Facelet_Composition_Page_Description=Creates a new facelet page for use with a template.
\ No newline at end of file
diff --git a/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.ui/templates/templates.xml b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.ui/templates/templates.xml
new file mode 100644
index 0000000..822ca2e
--- /dev/null
+++ b/org.eclipse.jsf/plugins/org.eclipse.jst.jsf.facelet.ui/templates/templates.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?><templates><template id="org.eclipse.jst.jsf.facelet.ui.new_simple_footer_xhtml" autoinsert="false" context="html_new" deleted="false" description="%New_Footer_Description" enabled="true" name="%New_Footer">&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt;&#13;
+&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;&#13;
+&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;&#13;
+&lt;head&gt;&#13;
+&lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /&gt;&#13;
+&lt;title&gt;Insert title here&lt;/title&gt;&#13;
+&lt;/head&gt;&#13;
+&lt;body&gt;&#13;
+&lt;div style="background-color: navy;width: 100%;color: white"&gt;&lt;/div&gt;&#13;
+&lt;/body&gt;&#13;
+&lt;/html&gt;</template><template id="org.eclipse.jst.jsf.facelet.ui.new_header_xhtml" autoinsert="false" context="html_new" deleted="false" description="%New_Facelet_Header_Description" enabled="true" name="%New_Facelet_Header">&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt;&#13;
+&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;&#13;
+&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;&#13;
+&lt;body&gt;&#13;
+&lt;div style="font-size: 36px;line-height: 48px;background-color: navy;width: 100%;color: white"&gt;My Facelet Application&lt;/div&gt;&#13;
+&lt;/body&gt;&#13;
+&lt;/html&gt;</template><template id="org.eclipse.jst.jsf.facelet.ui.new_basic_template_xhtml" autoinsert="false" context="html_new" deleted="false" description="%New_Facelet_Template_Description" enabled="true" name="%New_Facelet_Template">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &#13;
+          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;&#13;
+&lt;html xmlns="http://www.w3.org/1999/xhtml"&#13;
+      xmlns:ui="http://java.sun.com/jsf/facelets"&gt;&#13;
+&lt;head&gt;&#13;
+  &lt;title&gt;&lt;ui:insert name="title"&gt;Default title&lt;/ui:insert&gt;&lt;/title&gt;&#13;
+&lt;/head&gt;&#13;
+&#13;
+&lt;body&gt;&#13;
+&#13;
+&lt;div id="header"&gt;&#13;
+    &lt;ui:insert name="header"&gt;&#13;
+    	Header area.  See comments below this line in the source.&#13;
+    	&lt;!--  include your header file or uncomment the include below and create header.xhtml in this directory --&gt;&#13;
+    	&lt;!-- &lt;ui:include src="header.xhtml"/&gt; --&gt;&#13;
+    &lt;/ui:insert&gt;&#13;
+&lt;/div&gt;&#13;
+&#13;
+&#13;
+&lt;div id="center"&gt;&#13;
+  &lt;ui:insert name="content"&gt;&#13;
+    	Content area.  See comments below this line in the source.&#13;
+    	&lt;!--  include your content file or uncomment the include below and create content.xhtml in this directory --&gt;&#13;
+	  	&lt;!-- &lt;div&gt; --&gt;&#13;
+    	&lt;!-- &lt;ui:include src="content.xhtml"/&gt; --&gt;  &#13;
+    	&lt;!-- &lt;/div&gt; --&gt;&#13;
+  &lt;/ui:insert&gt;&#13;
+&lt;/div&gt;&#13;
+&#13;
+&lt;div id="footer"&gt;&#13;
+    	Footer area.  See comments below this line in the source.&#13;
+    	&lt;!--  include your header file or uncomment the include below and create footer.xhtml in this directory --&gt;&#13;
+	    &lt;!-- ui:insert name="footer"&gt; --&gt;&#13;
+		&lt;!--    	&lt;ui:include src="footer.xhtml"/&gt;  --&gt;&#13;
+		&lt;!--  	&lt;/ui:insert&gt;--&gt;&#13;
+&lt;/div&gt;&#13;
+&#13;
+&lt;/body&gt;&#13;
+&#13;
+&lt;/html&gt;</template><template id="org.eclipse.jst.jsf.facelet.ui.new_basic_composition_xhtml" autoinsert="false" context="html_new" deleted="false" description="%New_Simple_Facelet_Composition_Page_Description" enabled="true" name="%New_Simple_Facelet_Composition_Page">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &#13;
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;&#13;
+&#13;
+&lt;html xmlns="http://www.w3.org/1999/xhtml"&#13;
+	xmlns:ui="http://java.sun.com/jsf/facelets"&#13;
+	xmlns:h="http://java.sun.com/jsf/html"&#13;
+	xmlns:f="http://java.sun.com/jsf/core"&gt;&#13;
+&#13;
+&lt;ui:composition template=""&gt;&#13;
+	&lt;ui:define name="header"&gt;&#13;
+	    Add your header here or delete to use the default&#13;
+	&lt;/ui:define&gt;&#13;
+	&lt;ui:define name="content"&gt;&#13;
+	    Add your content here or delete to use the default&#13;
+	&lt;/ui:define&gt;&#13;
+	&lt;ui:define name="footer"&gt;&#13;
+	    Add your content here or delete to use the default&#13;
+	&lt;/ui:define&gt;&#13;
+&lt;/ui:composition&gt;&#13;
+&lt;/html&gt;</template></templates>
\ No newline at end of file