diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/.classpath b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/.classpath
index 1564e29..127fa65 100644
--- a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/.classpath
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/.classpath
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
+	<classpathentry kind="src" path="src-emf"/>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="lib" path="lib/flute.jar"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/META-INF/MANIFEST.MF b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/META-INF/MANIFEST.MF
index 8e570c2..18c51a8 100644
--- a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/META-INF/MANIFEST.MF
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/META-INF/MANIFEST.MF
@@ -11,13 +11,18 @@
  org.eclipse.wst.sse.core;bundle-version="[1.1.0,2.0.0)",
  org.eclipse.wst.xml.core;bundle-version="[1.1.0,2.0.0)",
  org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.wst.common.uriresolver;bundle-version="[1.1.0,2.0.0)"
+ org.eclipse.wst.common.uriresolver;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.emf;bundle-version="2.4.0",
+ org.eclipse.emf.ecore;bundle-version="2.4.1"
 Export-Package: org.eclipse.wst.xml.vex.core.internal;x-internal:=true,
  org.eclipse.wst.xml.vex.core.internal.core;x-internal:=true,
  org.eclipse.wst.xml.vex.core.internal.css;x-internal:=true,
  org.eclipse.wst.xml.vex.core.internal.dom;x-internal:=true,
  org.eclipse.wst.xml.vex.core.internal.layout;x-internal:=true,
  org.eclipse.wst.xml.vex.core.internal.provisional.dom;x-internal:=true,
+ org.eclipse.wst.xml.vex.core.internal.provisional.dom.I,
+ org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl,
+ org.eclipse.wst.xml.vex.core.internal.provisional.dom.util,
  org.eclipse.wst.xml.vex.core.internal.undo;x-internal:=true,
  org.eclipse.wst.xml.vex.core.internal.util;x-internal:=true,
  org.eclipse.wst.xml.vex.core.internal.validator;x-internal:=true,
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/build.properties b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/build.properties
index 75cde60..48bd548 100644
--- a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/build.properties
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/build.properties
@@ -3,10 +3,14 @@
                .,\
                lib/,\
                lib/flute.jar,\
-               bin/
+               bin/,\
+               plugin.xml
 src.includes = lib/,\
+               src-emf/,\
                src/
-source.. = src/
-jars.compile.order = .
+source.. = src/,\
+           src-emf/
+der = .
 bin.excludes = lib/.cvsignore
 src.excludes = lib/.cvsignore
+output.. = bin/
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/emf/vexdocument.genmodel b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/emf/vexdocument.genmodel
index 0d47b47..e6e0cd3 100644
--- a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/emf/vexdocument.genmodel
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/emf/vexdocument.genmodel
@@ -3,10 +3,11 @@
     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" modelDirectory="/org.eclipse.wst.xml.vex.core/src-emf"
     modelPluginID="org.eclipse.wst.xml.vex.core" modelName="Vexdocument" modelPluginClass=""
-    importerID="org.eclipse.emf.importer.java" complianceLevel="5.0" copyrightFields="false">
+    testsDirectory="/org.eclipse.wst.xml.vex.core.tests/src_emf" importerID="org.eclipse.emf.importer.java"
+    complianceLevel="5.0" copyrightFields="false">
   <foreignModel>@model</foreignModel>
   <genPackages prefix="DomEMF" basePackage="org.eclipse.wst.xml.vex.core.internal.provisional"
-      disposableProviderFactory="true" ecorePackage="dom1.ecore#/">
+      disposableProviderFactory="true" interfacePackageSuffix="I" ecorePackage="dom1.ecore#/">
     <genDataTypes ecoreDataType="dom1.ecore#//DocumentValidationException"/>
     <genDataTypes ecoreDataType="dom1.ecore#//AttributeDefinition"/>
     <genDataTypes ecoreDataType="dom1.ecore#//Set">
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/plugin.properties b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/plugin.properties
index 8a7bbd6..9565655 100644
--- a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/plugin.properties
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/plugin.properties
@@ -1,2 +1,3 @@
 plugin.name=Vex Toolkit
-providerName=Eclipse.org
\ No newline at end of file
+providerName=Eclipse.org
+pluginName = Vexdocument Model
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/plugin.xml b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/plugin.xml
new file mode 100644
index 0000000..5535690
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/plugin.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+
+</plugin>
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/DomEMFFactory.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/DomEMFFactory.java
new file mode 100644
index 0000000..ea2a8c5
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/DomEMFFactory.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom;
+
+import org.eclipse.emf.ecore.EFactory;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Position;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXComment;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXProcessingInstruction;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator;
+
+/**
+ * <!-- 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.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage
+ * @generated
+ */
+public interface DomEMFFactory extends EFactory {
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	DomEMFFactory eINSTANCE = org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFFactoryImpl.init();
+
+	/**
+	 * Returns a new object of class '<em>Content</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Content</em>'.
+	 * @generated
+	 */
+	Content createContent();
+
+	/**
+	 * Returns a new object of class '<em>Position</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Position</em>'.
+	 * @generated
+	 */
+	Position createPosition();
+
+	/**
+	 * Returns a new object of class '<em>VEX Attribute</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>VEX Attribute</em>'.
+	 * @generated
+	 */
+	VEXAttribute createVEXAttribute();
+
+	/**
+	 * Returns a new object of class '<em>VEX Comment</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>VEX Comment</em>'.
+	 * @generated
+	 */
+	VEXComment createVEXComment();
+
+	/**
+	 * Returns a new object of class '<em>VEX Document</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>VEX Document</em>'.
+	 * @generated
+	 */
+	VEXDocument createVEXDocument();
+
+	/**
+	 * Returns a new object of class '<em>VEX Document Fragment</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>VEX Document Fragment</em>'.
+	 * @generated
+	 */
+	VEXDocumentFragment createVEXDocumentFragment();
+
+	/**
+	 * Returns a new object of class '<em>VEX Element</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>VEX Element</em>'.
+	 * @generated
+	 */
+	VEXElement createVEXElement();
+
+	/**
+	 * Returns a new object of class '<em>VEX Node</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>VEX Node</em>'.
+	 * @generated
+	 */
+	VEXNode createVEXNode();
+
+	/**
+	 * Returns a new object of class '<em>VEX Processing Instruction</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>VEX Processing Instruction</em>'.
+	 * @generated
+	 */
+	VEXProcessingInstruction createVEXProcessingInstruction();
+
+	/**
+	 * Returns a new object of class '<em>Validator</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Validator</em>'.
+	 * @generated
+	 */
+	Validator createValidator();
+
+	/**
+	 * Returns the package supported by this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the package supported by this factory.
+	 * @generated
+	 */
+	DomEMFPackage getDomEMFPackage();
+
+} //DomEMFFactory
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/DomEMFPackage.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/DomEMFPackage.java
new file mode 100644
index 0000000..810c14a
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/DomEMFPackage.java
@@ -0,0 +1,1839 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+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.wst.xml.vex.core.internal.provisional.dom.DomEMFFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface DomEMFPackage extends EPackage {
+	/**
+	 * The package name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNAME = "dom";
+
+	/**
+	 * The package namespace URI.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_URI = "http:///org/eclipse/wst/xml/vex/core/internal/provisional/dom.ecore";
+
+	/**
+	 * The package namespace name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_PREFIX = "org.eclipse.wst.xml.vex.core.internal.provisional.dom";
+
+	/**
+	 * The singleton instance of the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	DomEMFPackage eINSTANCE = org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl.init();
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.ContentImpl <em>Content</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.ContentImpl
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getContent()
+	 * @generated
+	 */
+	int CONTENT = 0;
+
+	/**
+	 * The feature id for the '<em><b>Length</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONTENT__LENGTH = 0;
+
+	/**
+	 * The number of structural features of the '<em>Content</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CONTENT_FEATURE_COUNT = 1;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.PositionImpl <em>Position</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.PositionImpl
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getPosition()
+	 * @generated
+	 */
+	int POSITION = 1;
+
+	/**
+	 * The feature id for the '<em><b>Offset</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int POSITION__OFFSET = 0;
+
+	/**
+	 * The number of structural features of the '<em>Position</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int POSITION_FEATURE_COUNT = 1;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXNodeImpl <em>VEX Node</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXNodeImpl
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getVEXNode()
+	 * @generated
+	 */
+	int VEX_NODE = 7;
+
+	/**
+	 * The feature id for the '<em><b>Content</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_NODE__CONTENT = 0;
+
+	/**
+	 * The feature id for the '<em><b>End Offset</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_NODE__END_OFFSET = 1;
+
+	/**
+	 * The feature id for the '<em><b>End Position</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_NODE__END_POSITION = 2;
+
+	/**
+	 * The feature id for the '<em><b>Start Offset</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_NODE__START_OFFSET = 3;
+
+	/**
+	 * The feature id for the '<em><b>Start Position</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_NODE__START_POSITION = 4;
+
+	/**
+	 * The feature id for the '<em><b>Text</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_NODE__TEXT = 5;
+
+	/**
+	 * The number of structural features of the '<em>VEX Node</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_NODE_FEATURE_COUNT = 6;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXAttributeImpl <em>VEX Attribute</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXAttributeImpl
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getVEXAttribute()
+	 * @generated
+	 */
+	int VEX_ATTRIBUTE = 2;
+
+	/**
+	 * The feature id for the '<em><b>Content</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ATTRIBUTE__CONTENT = VEX_NODE__CONTENT;
+
+	/**
+	 * The feature id for the '<em><b>End Offset</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ATTRIBUTE__END_OFFSET = VEX_NODE__END_OFFSET;
+
+	/**
+	 * The feature id for the '<em><b>End Position</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ATTRIBUTE__END_POSITION = VEX_NODE__END_POSITION;
+
+	/**
+	 * The feature id for the '<em><b>Start Offset</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ATTRIBUTE__START_OFFSET = VEX_NODE__START_OFFSET;
+
+	/**
+	 * The feature id for the '<em><b>Start Position</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ATTRIBUTE__START_POSITION = VEX_NODE__START_POSITION;
+
+	/**
+	 * The feature id for the '<em><b>Text</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ATTRIBUTE__TEXT = VEX_NODE__TEXT;
+
+	/**
+	 * The feature id for the '<em><b>Document</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ATTRIBUTE__DOCUMENT = VEX_NODE_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ATTRIBUTE__VALUE = VEX_NODE_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Parent</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ATTRIBUTE__PARENT = VEX_NODE_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Local Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ATTRIBUTE__LOCAL_NAME = VEX_NODE_FEATURE_COUNT + 3;
+
+	/**
+	 * The feature id for the '<em><b>Namespace Prefix</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ATTRIBUTE__NAMESPACE_PREFIX = VEX_NODE_FEATURE_COUNT + 4;
+
+	/**
+	 * The feature id for the '<em><b>Namespace URI</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ATTRIBUTE__NAMESPACE_URI = VEX_NODE_FEATURE_COUNT + 5;
+
+	/**
+	 * The number of structural features of the '<em>VEX Attribute</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ATTRIBUTE_FEATURE_COUNT = VEX_NODE_FEATURE_COUNT + 6;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXCommentImpl <em>VEX Comment</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXCommentImpl
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getVEXComment()
+	 * @generated
+	 */
+	int VEX_COMMENT = 3;
+
+	/**
+	 * The feature id for the '<em><b>Content</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_COMMENT__CONTENT = VEX_NODE__CONTENT;
+
+	/**
+	 * The feature id for the '<em><b>End Offset</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_COMMENT__END_OFFSET = VEX_NODE__END_OFFSET;
+
+	/**
+	 * The feature id for the '<em><b>End Position</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_COMMENT__END_POSITION = VEX_NODE__END_POSITION;
+
+	/**
+	 * The feature id for the '<em><b>Start Offset</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_COMMENT__START_OFFSET = VEX_NODE__START_OFFSET;
+
+	/**
+	 * The feature id for the '<em><b>Start Position</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_COMMENT__START_POSITION = VEX_NODE__START_POSITION;
+
+	/**
+	 * The feature id for the '<em><b>Text</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_COMMENT__TEXT = VEX_NODE__TEXT;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_COMMENT__VALUE = VEX_NODE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>VEX Comment</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_COMMENT_FEATURE_COUNT = VEX_NODE_FEATURE_COUNT + 1;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXDocumentImpl <em>VEX Document</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXDocumentImpl
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getVEXDocument()
+	 * @generated
+	 */
+	int VEX_DOCUMENT = 4;
+
+	/**
+	 * The feature id for the '<em><b>Encoding</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_DOCUMENT__ENCODING = 0;
+
+	/**
+	 * The feature id for the '<em><b>Length</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_DOCUMENT__LENGTH = 1;
+
+	/**
+	 * The feature id for the '<em><b>Root Element</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_DOCUMENT__ROOT_ELEMENT = 2;
+
+	/**
+	 * The feature id for the '<em><b>Validator</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_DOCUMENT__VALIDATOR = 3;
+
+	/**
+	 * The feature id for the '<em><b>Public ID</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_DOCUMENT__PUBLIC_ID = 4;
+
+	/**
+	 * The number of structural features of the '<em>VEX Document</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_DOCUMENT_FEATURE_COUNT = 5;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXDocumentFragmentImpl <em>VEX Document Fragment</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXDocumentFragmentImpl
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getVEXDocumentFragment()
+	 * @generated
+	 */
+	int VEX_DOCUMENT_FRAGMENT = 5;
+
+	/**
+	 * The feature id for the '<em><b>Content</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_DOCUMENT_FRAGMENT__CONTENT = 0;
+
+	/**
+	 * The feature id for the '<em><b>Length</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_DOCUMENT_FRAGMENT__LENGTH = 1;
+
+	/**
+	 * The feature id for the '<em><b>Elements</b></em>' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_DOCUMENT_FRAGMENT__ELEMENTS = 2;
+
+	/**
+	 * The feature id for the '<em><b>Node Names</b></em>' attribute list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_DOCUMENT_FRAGMENT__NODE_NAMES = 3;
+
+	/**
+	 * The feature id for the '<em><b>Nodes</b></em>' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_DOCUMENT_FRAGMENT__NODES = 4;
+
+	/**
+	 * The number of structural features of the '<em>VEX Document Fragment</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_DOCUMENT_FRAGMENT_FEATURE_COUNT = 5;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXElementImpl <em>VEX Element</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXElementImpl
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getVEXElement()
+	 * @generated
+	 */
+	int VEX_ELEMENT = 6;
+
+	/**
+	 * The feature id for the '<em><b>Content</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ELEMENT__CONTENT = VEX_NODE__CONTENT;
+
+	/**
+	 * The feature id for the '<em><b>End Offset</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ELEMENT__END_OFFSET = VEX_NODE__END_OFFSET;
+
+	/**
+	 * The feature id for the '<em><b>End Position</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ELEMENT__END_POSITION = VEX_NODE__END_POSITION;
+
+	/**
+	 * The feature id for the '<em><b>Start Offset</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ELEMENT__START_OFFSET = VEX_NODE__START_OFFSET;
+
+	/**
+	 * The feature id for the '<em><b>Start Position</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ELEMENT__START_POSITION = VEX_NODE__START_POSITION;
+
+	/**
+	 * The feature id for the '<em><b>Text</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ELEMENT__TEXT = VEX_NODE__TEXT;
+
+	/**
+	 * The feature id for the '<em><b>Attribute Names</b></em>' attribute list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ELEMENT__ATTRIBUTE_NAMES = VEX_NODE_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Child Elements</b></em>' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ELEMENT__CHILD_ELEMENTS = VEX_NODE_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ELEMENT__CHILD_NODES = VEX_NODE_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Document</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ELEMENT__DOCUMENT = VEX_NODE_FEATURE_COUNT + 3;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ELEMENT__NAME = VEX_NODE_FEATURE_COUNT + 4;
+
+	/**
+	 * The feature id for the '<em><b>Empty</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ELEMENT__EMPTY = VEX_NODE_FEATURE_COUNT + 5;
+
+	/**
+	 * The feature id for the '<em><b>Parent</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ELEMENT__PARENT = VEX_NODE_FEATURE_COUNT + 6;
+
+	/**
+	 * The feature id for the '<em><b>Namespace Prefix</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ELEMENT__NAMESPACE_PREFIX = VEX_NODE_FEATURE_COUNT + 7;
+
+	/**
+	 * The feature id for the '<em><b>Namespace URI</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ELEMENT__NAMESPACE_URI = VEX_NODE_FEATURE_COUNT + 8;
+
+	/**
+	 * The number of structural features of the '<em>VEX Element</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_ELEMENT_FEATURE_COUNT = VEX_NODE_FEATURE_COUNT + 9;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXProcessingInstructionImpl <em>VEX Processing Instruction</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXProcessingInstructionImpl
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getVEXProcessingInstruction()
+	 * @generated
+	 */
+	int VEX_PROCESSING_INSTRUCTION = 8;
+
+	/**
+	 * The feature id for the '<em><b>Content</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_PROCESSING_INSTRUCTION__CONTENT = VEX_NODE__CONTENT;
+
+	/**
+	 * The feature id for the '<em><b>End Offset</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_PROCESSING_INSTRUCTION__END_OFFSET = VEX_NODE__END_OFFSET;
+
+	/**
+	 * The feature id for the '<em><b>End Position</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_PROCESSING_INSTRUCTION__END_POSITION = VEX_NODE__END_POSITION;
+
+	/**
+	 * The feature id for the '<em><b>Start Offset</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_PROCESSING_INSTRUCTION__START_OFFSET = VEX_NODE__START_OFFSET;
+
+	/**
+	 * The feature id for the '<em><b>Start Position</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_PROCESSING_INSTRUCTION__START_POSITION = VEX_NODE__START_POSITION;
+
+	/**
+	 * The feature id for the '<em><b>Text</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_PROCESSING_INSTRUCTION__TEXT = VEX_NODE__TEXT;
+
+	/**
+	 * The feature id for the '<em><b>Attributes</b></em>' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_PROCESSING_INSTRUCTION__ATTRIBUTES = VEX_NODE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>VEX Processing Instruction</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEX_PROCESSING_INSTRUCTION_FEATURE_COUNT = VEX_NODE_FEATURE_COUNT + 1;
+
+	/**
+	 * The meta object id for the '{@link java.io.Serializable <em>Serializable</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see java.io.Serializable
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getSerializable()
+	 * @generated
+	 */
+	int SERIALIZABLE = 10;
+
+	/**
+	 * The number of structural features of the '<em>Serializable</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SERIALIZABLE_FEATURE_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.ValidatorImpl <em>Validator</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.ValidatorImpl
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getValidator()
+	 * @generated
+	 */
+	int VALIDATOR = 9;
+
+	/**
+	 * The feature id for the '<em><b>Valid Root Elements</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VALIDATOR__VALID_ROOT_ELEMENTS = SERIALIZABLE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Validator</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VALIDATOR_FEATURE_COUNT = SERIALIZABLE_FEATURE_COUNT + 1;
+
+	/**
+	 * The meta object id for the '<em>Document Validation Exception</em>' data type.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.dom.DocumentValidationException
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getDocumentValidationException()
+	 * @generated
+	 */
+	int DOCUMENT_VALIDATION_EXCEPTION = 11;
+
+	/**
+	 * The meta object id for the '<em>Attribute Definition</em>' data type.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.validator.AttributeDefinition
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getAttributeDefinition()
+	 * @generated
+	 */
+	int ATTRIBUTE_DEFINITION = 12;
+
+	/**
+	 * The meta object id for the '<em>Set</em>' data type.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see java.util.Set
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getSet()
+	 * @generated
+	 */
+	int SET = 13;
+
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content <em>Content</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Content</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content
+	 * @generated
+	 */
+	EClass getContent();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content#getLength <em>Length</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Length</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content#getLength()
+	 * @see #getContent()
+	 * @generated
+	 */
+	EAttribute getContent_Length();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Position <em>Position</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Position</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Position
+	 * @generated
+	 */
+	EClass getPosition();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Position#getOffset <em>Offset</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Offset</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Position#getOffset()
+	 * @see #getPosition()
+	 * @generated
+	 */
+	EAttribute getPosition_Offset();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute <em>VEX Attribute</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>VEX Attribute</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute
+	 * @generated
+	 */
+	EClass getVEXAttribute();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getDocument <em>Document</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Document</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getDocument()
+	 * @see #getVEXAttribute()
+	 * @generated
+	 */
+	EReference getVEXAttribute_Document();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Value</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getValue()
+	 * @see #getVEXAttribute()
+	 * @generated
+	 */
+	EAttribute getVEXAttribute_Value();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getParent <em>Parent</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Parent</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getParent()
+	 * @see #getVEXAttribute()
+	 * @generated
+	 */
+	EReference getVEXAttribute_Parent();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getLocalName <em>Local Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Local Name</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getLocalName()
+	 * @see #getVEXAttribute()
+	 * @generated
+	 */
+	EAttribute getVEXAttribute_LocalName();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getNamespacePrefix <em>Namespace Prefix</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Namespace Prefix</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getNamespacePrefix()
+	 * @see #getVEXAttribute()
+	 * @generated
+	 */
+	EAttribute getVEXAttribute_NamespacePrefix();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getNamespaceURI <em>Namespace URI</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Namespace URI</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getNamespaceURI()
+	 * @see #getVEXAttribute()
+	 * @generated
+	 */
+	EAttribute getVEXAttribute_NamespaceURI();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXComment <em>VEX Comment</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>VEX Comment</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXComment
+	 * @generated
+	 */
+	EClass getVEXComment();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXComment#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Value</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXComment#getValue()
+	 * @see #getVEXComment()
+	 * @generated
+	 */
+	EAttribute getVEXComment_Value();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument <em>VEX Document</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>VEX Document</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument
+	 * @generated
+	 */
+	EClass getVEXDocument();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getEncoding <em>Encoding</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Encoding</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getEncoding()
+	 * @see #getVEXDocument()
+	 * @generated
+	 */
+	EAttribute getVEXDocument_Encoding();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getLength <em>Length</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Length</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getLength()
+	 * @see #getVEXDocument()
+	 * @generated
+	 */
+	EAttribute getVEXDocument_Length();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getRootElement <em>Root Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Root Element</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getRootElement()
+	 * @see #getVEXDocument()
+	 * @generated
+	 */
+	EReference getVEXDocument_RootElement();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getValidator <em>Validator</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Validator</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getValidator()
+	 * @see #getVEXDocument()
+	 * @generated
+	 */
+	EReference getVEXDocument_Validator();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getPublicID <em>Public ID</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Public ID</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getPublicID()
+	 * @see #getVEXDocument()
+	 * @generated
+	 */
+	EAttribute getVEXDocument_PublicID();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment <em>VEX Document Fragment</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>VEX Document Fragment</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment
+	 * @generated
+	 */
+	EClass getVEXDocumentFragment();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment#getContent <em>Content</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Content</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment#getContent()
+	 * @see #getVEXDocumentFragment()
+	 * @generated
+	 */
+	EReference getVEXDocumentFragment_Content();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment#getLength <em>Length</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Length</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment#getLength()
+	 * @see #getVEXDocumentFragment()
+	 * @generated
+	 */
+	EAttribute getVEXDocumentFragment_Length();
+
+	/**
+	 * Returns the meta object for the reference list '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment#getElements <em>Elements</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference list '<em>Elements</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment#getElements()
+	 * @see #getVEXDocumentFragment()
+	 * @generated
+	 */
+	EReference getVEXDocumentFragment_Elements();
+
+	/**
+	 * Returns the meta object for the attribute list '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment#getNodeNames <em>Node Names</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute list '<em>Node Names</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment#getNodeNames()
+	 * @see #getVEXDocumentFragment()
+	 * @generated
+	 */
+	EAttribute getVEXDocumentFragment_NodeNames();
+
+	/**
+	 * Returns the meta object for the reference list '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment#getNodes <em>Nodes</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference list '<em>Nodes</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment#getNodes()
+	 * @see #getVEXDocumentFragment()
+	 * @generated
+	 */
+	EReference getVEXDocumentFragment_Nodes();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement <em>VEX Element</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>VEX Element</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement
+	 * @generated
+	 */
+	EClass getVEXElement();
+
+	/**
+	 * Returns the meta object for the attribute list '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getAttributeNames <em>Attribute Names</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute list '<em>Attribute Names</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getAttributeNames()
+	 * @see #getVEXElement()
+	 * @generated
+	 */
+	EAttribute getVEXElement_AttributeNames();
+
+	/**
+	 * Returns the meta object for the reference list '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getChildElements <em>Child Elements</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference list '<em>Child Elements</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getChildElements()
+	 * @see #getVEXElement()
+	 * @generated
+	 */
+	EReference getVEXElement_ChildElements();
+
+	/**
+	 * Returns the meta object for the reference list '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getChildNodes <em>Child Nodes</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference list '<em>Child Nodes</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getChildNodes()
+	 * @see #getVEXElement()
+	 * @generated
+	 */
+	EReference getVEXElement_ChildNodes();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getDocument <em>Document</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Document</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getDocument()
+	 * @see #getVEXElement()
+	 * @generated
+	 */
+	EReference getVEXElement_Document();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getName <em>Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Name</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getName()
+	 * @see #getVEXElement()
+	 * @generated
+	 */
+	EAttribute getVEXElement_Name();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#isEmpty <em>Empty</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Empty</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#isEmpty()
+	 * @see #getVEXElement()
+	 * @generated
+	 */
+	EAttribute getVEXElement_Empty();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getParent <em>Parent</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Parent</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getParent()
+	 * @see #getVEXElement()
+	 * @generated
+	 */
+	EReference getVEXElement_Parent();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getNamespacePrefix <em>Namespace Prefix</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Namespace Prefix</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getNamespacePrefix()
+	 * @see #getVEXElement()
+	 * @generated
+	 */
+	EAttribute getVEXElement_NamespacePrefix();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getNamespaceURI <em>Namespace URI</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Namespace URI</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getNamespaceURI()
+	 * @see #getVEXElement()
+	 * @generated
+	 */
+	EAttribute getVEXElement_NamespaceURI();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode <em>VEX Node</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>VEX Node</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode
+	 * @generated
+	 */
+	EClass getVEXNode();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getContent <em>Content</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Content</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getContent()
+	 * @see #getVEXNode()
+	 * @generated
+	 */
+	EReference getVEXNode_Content();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getEndOffset <em>End Offset</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>End Offset</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getEndOffset()
+	 * @see #getVEXNode()
+	 * @generated
+	 */
+	EAttribute getVEXNode_EndOffset();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getEndPosition <em>End Position</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>End Position</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getEndPosition()
+	 * @see #getVEXNode()
+	 * @generated
+	 */
+	EReference getVEXNode_EndPosition();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getStartOffset <em>Start Offset</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Start Offset</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getStartOffset()
+	 * @see #getVEXNode()
+	 * @generated
+	 */
+	EAttribute getVEXNode_StartOffset();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getStartPosition <em>Start Position</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Start Position</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getStartPosition()
+	 * @see #getVEXNode()
+	 * @generated
+	 */
+	EReference getVEXNode_StartPosition();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getText <em>Text</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Text</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getText()
+	 * @see #getVEXNode()
+	 * @generated
+	 */
+	EAttribute getVEXNode_Text();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXProcessingInstruction <em>VEX Processing Instruction</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>VEX Processing Instruction</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXProcessingInstruction
+	 * @generated
+	 */
+	EClass getVEXProcessingInstruction();
+
+	/**
+	 * Returns the meta object for the reference list '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXProcessingInstruction#getAttributes <em>Attributes</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference list '<em>Attributes</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXProcessingInstruction#getAttributes()
+	 * @see #getVEXProcessingInstruction()
+	 * @generated
+	 */
+	EReference getVEXProcessingInstruction_Attributes();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator <em>Validator</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Validator</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator
+	 * @generated
+	 */
+	EClass getValidator();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator#getValidRootElements <em>Valid Root Elements</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Valid Root Elements</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator#getValidRootElements()
+	 * @see #getValidator()
+	 * @generated
+	 */
+	EAttribute getValidator_ValidRootElements();
+
+	/**
+	 * Returns the meta object for class '{@link java.io.Serializable <em>Serializable</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Serializable</em>'.
+	 * @see java.io.Serializable
+	 * @model instanceClass="java.io.Serializable"
+	 * @generated
+	 */
+	EClass getSerializable();
+
+	/**
+	 * Returns the meta object for data type '{@link org.eclipse.wst.xml.vex.core.internal.dom.DocumentValidationException <em>Document Validation Exception</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for data type '<em>Document Validation Exception</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.dom.DocumentValidationException
+	 * @model instanceClass="org.eclipse.wst.xml.vex.core.internal.dom.DocumentValidationException"
+	 * @generated
+	 */
+	EDataType getDocumentValidationException();
+
+	/**
+	 * Returns the meta object for data type '{@link org.eclipse.wst.xml.vex.core.internal.validator.AttributeDefinition <em>Attribute Definition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for data type '<em>Attribute Definition</em>'.
+	 * @see org.eclipse.wst.xml.vex.core.internal.validator.AttributeDefinition
+	 * @model instanceClass="org.eclipse.wst.xml.vex.core.internal.validator.AttributeDefinition"
+	 * @generated
+	 */
+	EDataType getAttributeDefinition();
+
+	/**
+	 * Returns the meta object for data type '{@link java.util.Set <em>Set</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for data type '<em>Set</em>'.
+	 * @see java.util.Set
+	 * @model instanceClass="java.util.Set" typeParameters="T"
+	 * @generated
+	 */
+	EDataType getSet();
+
+	/**
+	 * 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
+	 */
+	DomEMFFactory getDomEMFFactory();
+
+	/**
+	 * <!-- 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
+	 */
+	interface Literals {
+		/**
+		 * The meta object literal for the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.ContentImpl <em>Content</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.ContentImpl
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getContent()
+		 * @generated
+		 */
+		EClass CONTENT = eINSTANCE.getContent();
+
+		/**
+		 * The meta object literal for the '<em><b>Length</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute CONTENT__LENGTH = eINSTANCE.getContent_Length();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.PositionImpl <em>Position</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.PositionImpl
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getPosition()
+		 * @generated
+		 */
+		EClass POSITION = eINSTANCE.getPosition();
+
+		/**
+		 * The meta object literal for the '<em><b>Offset</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute POSITION__OFFSET = eINSTANCE.getPosition_Offset();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXAttributeImpl <em>VEX Attribute</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXAttributeImpl
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getVEXAttribute()
+		 * @generated
+		 */
+		EClass VEX_ATTRIBUTE = eINSTANCE.getVEXAttribute();
+
+		/**
+		 * The meta object literal for the '<em><b>Document</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference VEX_ATTRIBUTE__DOCUMENT = eINSTANCE.getVEXAttribute_Document();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VEX_ATTRIBUTE__VALUE = eINSTANCE.getVEXAttribute_Value();
+
+		/**
+		 * The meta object literal for the '<em><b>Parent</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference VEX_ATTRIBUTE__PARENT = eINSTANCE.getVEXAttribute_Parent();
+
+		/**
+		 * The meta object literal for the '<em><b>Local Name</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VEX_ATTRIBUTE__LOCAL_NAME = eINSTANCE.getVEXAttribute_LocalName();
+
+		/**
+		 * The meta object literal for the '<em><b>Namespace Prefix</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VEX_ATTRIBUTE__NAMESPACE_PREFIX = eINSTANCE.getVEXAttribute_NamespacePrefix();
+
+		/**
+		 * The meta object literal for the '<em><b>Namespace URI</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VEX_ATTRIBUTE__NAMESPACE_URI = eINSTANCE.getVEXAttribute_NamespaceURI();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXCommentImpl <em>VEX Comment</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXCommentImpl
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getVEXComment()
+		 * @generated
+		 */
+		EClass VEX_COMMENT = eINSTANCE.getVEXComment();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VEX_COMMENT__VALUE = eINSTANCE.getVEXComment_Value();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXDocumentImpl <em>VEX Document</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXDocumentImpl
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getVEXDocument()
+		 * @generated
+		 */
+		EClass VEX_DOCUMENT = eINSTANCE.getVEXDocument();
+
+		/**
+		 * The meta object literal for the '<em><b>Encoding</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VEX_DOCUMENT__ENCODING = eINSTANCE.getVEXDocument_Encoding();
+
+		/**
+		 * The meta object literal for the '<em><b>Length</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VEX_DOCUMENT__LENGTH = eINSTANCE.getVEXDocument_Length();
+
+		/**
+		 * The meta object literal for the '<em><b>Root Element</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference VEX_DOCUMENT__ROOT_ELEMENT = eINSTANCE.getVEXDocument_RootElement();
+
+		/**
+		 * The meta object literal for the '<em><b>Validator</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference VEX_DOCUMENT__VALIDATOR = eINSTANCE.getVEXDocument_Validator();
+
+		/**
+		 * The meta object literal for the '<em><b>Public ID</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VEX_DOCUMENT__PUBLIC_ID = eINSTANCE.getVEXDocument_PublicID();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXDocumentFragmentImpl <em>VEX Document Fragment</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXDocumentFragmentImpl
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getVEXDocumentFragment()
+		 * @generated
+		 */
+		EClass VEX_DOCUMENT_FRAGMENT = eINSTANCE.getVEXDocumentFragment();
+
+		/**
+		 * The meta object literal for the '<em><b>Content</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference VEX_DOCUMENT_FRAGMENT__CONTENT = eINSTANCE.getVEXDocumentFragment_Content();
+
+		/**
+		 * The meta object literal for the '<em><b>Length</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VEX_DOCUMENT_FRAGMENT__LENGTH = eINSTANCE.getVEXDocumentFragment_Length();
+
+		/**
+		 * The meta object literal for the '<em><b>Elements</b></em>' reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference VEX_DOCUMENT_FRAGMENT__ELEMENTS = eINSTANCE.getVEXDocumentFragment_Elements();
+
+		/**
+		 * The meta object literal for the '<em><b>Node Names</b></em>' attribute list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VEX_DOCUMENT_FRAGMENT__NODE_NAMES = eINSTANCE.getVEXDocumentFragment_NodeNames();
+
+		/**
+		 * The meta object literal for the '<em><b>Nodes</b></em>' reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference VEX_DOCUMENT_FRAGMENT__NODES = eINSTANCE.getVEXDocumentFragment_Nodes();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXElementImpl <em>VEX Element</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXElementImpl
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getVEXElement()
+		 * @generated
+		 */
+		EClass VEX_ELEMENT = eINSTANCE.getVEXElement();
+
+		/**
+		 * The meta object literal for the '<em><b>Attribute Names</b></em>' attribute list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VEX_ELEMENT__ATTRIBUTE_NAMES = eINSTANCE.getVEXElement_AttributeNames();
+
+		/**
+		 * The meta object literal for the '<em><b>Child Elements</b></em>' reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference VEX_ELEMENT__CHILD_ELEMENTS = eINSTANCE.getVEXElement_ChildElements();
+
+		/**
+		 * The meta object literal for the '<em><b>Child Nodes</b></em>' reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference VEX_ELEMENT__CHILD_NODES = eINSTANCE.getVEXElement_ChildNodes();
+
+		/**
+		 * The meta object literal for the '<em><b>Document</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference VEX_ELEMENT__DOCUMENT = eINSTANCE.getVEXElement_Document();
+
+		/**
+		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VEX_ELEMENT__NAME = eINSTANCE.getVEXElement_Name();
+
+		/**
+		 * The meta object literal for the '<em><b>Empty</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VEX_ELEMENT__EMPTY = eINSTANCE.getVEXElement_Empty();
+
+		/**
+		 * The meta object literal for the '<em><b>Parent</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference VEX_ELEMENT__PARENT = eINSTANCE.getVEXElement_Parent();
+
+		/**
+		 * The meta object literal for the '<em><b>Namespace Prefix</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VEX_ELEMENT__NAMESPACE_PREFIX = eINSTANCE.getVEXElement_NamespacePrefix();
+
+		/**
+		 * The meta object literal for the '<em><b>Namespace URI</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VEX_ELEMENT__NAMESPACE_URI = eINSTANCE.getVEXElement_NamespaceURI();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXNodeImpl <em>VEX Node</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXNodeImpl
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getVEXNode()
+		 * @generated
+		 */
+		EClass VEX_NODE = eINSTANCE.getVEXNode();
+
+		/**
+		 * The meta object literal for the '<em><b>Content</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference VEX_NODE__CONTENT = eINSTANCE.getVEXNode_Content();
+
+		/**
+		 * The meta object literal for the '<em><b>End Offset</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VEX_NODE__END_OFFSET = eINSTANCE.getVEXNode_EndOffset();
+
+		/**
+		 * The meta object literal for the '<em><b>End Position</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference VEX_NODE__END_POSITION = eINSTANCE.getVEXNode_EndPosition();
+
+		/**
+		 * The meta object literal for the '<em><b>Start Offset</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VEX_NODE__START_OFFSET = eINSTANCE.getVEXNode_StartOffset();
+
+		/**
+		 * The meta object literal for the '<em><b>Start Position</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference VEX_NODE__START_POSITION = eINSTANCE.getVEXNode_StartPosition();
+
+		/**
+		 * The meta object literal for the '<em><b>Text</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VEX_NODE__TEXT = eINSTANCE.getVEXNode_Text();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXProcessingInstructionImpl <em>VEX Processing Instruction</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXProcessingInstructionImpl
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getVEXProcessingInstruction()
+		 * @generated
+		 */
+		EClass VEX_PROCESSING_INSTRUCTION = eINSTANCE.getVEXProcessingInstruction();
+
+		/**
+		 * The meta object literal for the '<em><b>Attributes</b></em>' reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference VEX_PROCESSING_INSTRUCTION__ATTRIBUTES = eINSTANCE.getVEXProcessingInstruction_Attributes();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.ValidatorImpl <em>Validator</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.ValidatorImpl
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getValidator()
+		 * @generated
+		 */
+		EClass VALIDATOR = eINSTANCE.getValidator();
+
+		/**
+		 * The meta object literal for the '<em><b>Valid Root Elements</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VALIDATOR__VALID_ROOT_ELEMENTS = eINSTANCE.getValidator_ValidRootElements();
+
+		/**
+		 * The meta object literal for the '{@link java.io.Serializable <em>Serializable</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see java.io.Serializable
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getSerializable()
+		 * @generated
+		 */
+		EClass SERIALIZABLE = eINSTANCE.getSerializable();
+
+		/**
+		 * The meta object literal for the '<em>Document Validation Exception</em>' data type.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.wst.xml.vex.core.internal.dom.DocumentValidationException
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getDocumentValidationException()
+		 * @generated
+		 */
+		EDataType DOCUMENT_VALIDATION_EXCEPTION = eINSTANCE.getDocumentValidationException();
+
+		/**
+		 * The meta object literal for the '<em>Attribute Definition</em>' data type.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.wst.xml.vex.core.internal.validator.AttributeDefinition
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getAttributeDefinition()
+		 * @generated
+		 */
+		EDataType ATTRIBUTE_DEFINITION = eINSTANCE.getAttributeDefinition();
+
+		/**
+		 * The meta object literal for the '<em>Set</em>' data type.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see java.util.Set
+		 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.DomEMFPackageImpl#getSet()
+		 * @generated
+		 */
+		EDataType SET = eINSTANCE.getSet();
+
+	}
+
+} //DomEMFPackage
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/Content.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/Content.java
new file mode 100644
index 0000000..a3c605b
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/Content.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.I;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Content</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content#getLength <em>Length</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getContent()
+ * @model
+ * @generated
+ */
+public interface Content extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Length</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Length</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Length</em>' attribute.
+	 * @see #setLength(int)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getContent_Length()
+	 * @model
+	 * @generated
+	 */
+	int getLength();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content#getLength <em>Length</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Length</em>' attribute.
+	 * @see #getLength()
+	 * @generated
+	 */
+	void setLength(int value);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	Position createPosition(int offset);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	void insertString(int offset, String s);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	void remove(int offset, int length);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	String getString(int offset, int length);
+
+} // Content
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/Position.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/Position.java
new file mode 100644
index 0000000..7c3c5dd
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/Position.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.I;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Position</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Position#getOffset <em>Offset</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getPosition()
+ * @model
+ * @generated
+ */
+public interface Position extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Offset</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Offset</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Offset</em>' attribute.
+	 * @see #setOffset(int)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getPosition_Offset()
+	 * @model
+	 * @generated
+	 */
+	int getOffset();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Position#getOffset <em>Offset</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Offset</em>' attribute.
+	 * @see #getOffset()
+	 * @generated
+	 */
+	void setOffset(int value);
+
+} // Position
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/VEXAttribute.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/VEXAttribute.java
new file mode 100644
index 0000000..756d200
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/VEXAttribute.java
@@ -0,0 +1,200 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.I;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>VEX Attribute</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getDocument <em>Document</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getValue <em>Value</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getParent <em>Parent</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getLocalName <em>Local Name</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getNamespacePrefix <em>Namespace Prefix</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getNamespaceURI <em>Namespace URI</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXAttribute()
+ * @model
+ * @generated
+ */
+public interface VEXAttribute extends VEXNode {
+	/**
+	 * Returns the value of the '<em><b>Document</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Document</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Document</em>' reference.
+	 * @see #setDocument(VEXDocument)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXAttribute_Document()
+	 * @model
+	 * @generated
+	 */
+	VEXDocument getDocument();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getDocument <em>Document</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Document</em>' reference.
+	 * @see #getDocument()
+	 * @generated
+	 */
+	void setDocument(VEXDocument value);
+
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' attribute.
+	 * @see #setValue(String)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXAttribute_Value()
+	 * @model
+	 * @generated
+	 */
+	String getValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getValue <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' attribute.
+	 * @see #getValue()
+	 * @generated
+	 */
+	void setValue(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Parent</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Parent</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Parent</em>' reference.
+	 * @see #setParent(VEXElement)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXAttribute_Parent()
+	 * @model
+	 * @generated
+	 */
+	VEXElement getParent();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getParent <em>Parent</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Parent</em>' reference.
+	 * @see #getParent()
+	 * @generated
+	 */
+	void setParent(VEXElement value);
+
+	/**
+	 * Returns the value of the '<em><b>Local Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Local 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>Local Name</em>' attribute.
+	 * @see #setLocalName(String)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXAttribute_LocalName()
+	 * @model
+	 * @generated
+	 */
+	String getLocalName();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getLocalName <em>Local Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Local Name</em>' attribute.
+	 * @see #getLocalName()
+	 * @generated
+	 */
+	void setLocalName(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Namespace Prefix</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Namespace Prefix</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Namespace Prefix</em>' attribute.
+	 * @see #setNamespacePrefix(String)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXAttribute_NamespacePrefix()
+	 * @model
+	 * @generated
+	 */
+	String getNamespacePrefix();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getNamespacePrefix <em>Namespace Prefix</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Namespace Prefix</em>' attribute.
+	 * @see #getNamespacePrefix()
+	 * @generated
+	 */
+	void setNamespacePrefix(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Namespace URI</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Namespace URI</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Namespace URI</em>' attribute.
+	 * @see #setNamespaceURI(String)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXAttribute_NamespaceURI()
+	 * @model
+	 * @generated
+	 */
+	String getNamespaceURI();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#getNamespaceURI <em>Namespace URI</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Namespace URI</em>' attribute.
+	 * @see #getNamespaceURI()
+	 * @generated
+	 */
+	void setNamespaceURI(String value);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	void setNamespace(String prefix, String namespaceURI);
+
+} // VEXAttribute
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/VEXComment.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/VEXComment.java
new file mode 100644
index 0000000..d0d45e1
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/VEXComment.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.I;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>VEX Comment</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXComment#getValue <em>Value</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXComment()
+ * @model
+ * @generated
+ */
+public interface VEXComment extends VEXNode {
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' attribute.
+	 * @see #setValue(String)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXComment_Value()
+	 * @model
+	 * @generated
+	 */
+	String getValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXComment#getValue <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' attribute.
+	 * @see #getValue()
+	 * @generated
+	 */
+	void setValue(String value);
+
+} // VEXComment
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/VEXDocument.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/VEXDocument.java
new file mode 100644
index 0000000..6985a69
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/VEXDocument.java
@@ -0,0 +1,290 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.I;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+import org.eclipse.wst.xml.vex.core.internal.dom.DocumentValidationException;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>VEX Document</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getEncoding <em>Encoding</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getLength <em>Length</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getRootElement <em>Root Element</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getValidator <em>Validator</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getPublicID <em>Public ID</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXDocument()
+ * @model
+ * @generated
+ */
+public interface VEXDocument extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Encoding</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Encoding</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Encoding</em>' attribute.
+	 * @see #setEncoding(String)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXDocument_Encoding()
+	 * @model
+	 * @generated
+	 */
+	String getEncoding();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getEncoding <em>Encoding</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Encoding</em>' attribute.
+	 * @see #getEncoding()
+	 * @generated
+	 */
+	void setEncoding(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Length</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Length</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Length</em>' attribute.
+	 * @see #setLength(int)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXDocument_Length()
+	 * @model
+	 * @generated
+	 */
+	int getLength();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getLength <em>Length</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Length</em>' attribute.
+	 * @see #getLength()
+	 * @generated
+	 */
+	void setLength(int value);
+
+	/**
+	 * Returns the value of the '<em><b>Root Element</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Root Element</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Root Element</em>' reference.
+	 * @see #setRootElement(VEXElement)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXDocument_RootElement()
+	 * @model
+	 * @generated
+	 */
+	VEXElement getRootElement();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getRootElement <em>Root Element</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Root Element</em>' reference.
+	 * @see #getRootElement()
+	 * @generated
+	 */
+	void setRootElement(VEXElement value);
+
+	/**
+	 * Returns the value of the '<em><b>Validator</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Validator</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Validator</em>' reference.
+	 * @see #setValidator(Validator)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXDocument_Validator()
+	 * @model
+	 * @generated
+	 */
+	Validator getValidator();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getValidator <em>Validator</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Validator</em>' reference.
+	 * @see #getValidator()
+	 * @generated
+	 */
+	void setValidator(Validator value);
+
+	/**
+	 * Returns the value of the '<em><b>Public ID</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Public ID</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Public ID</em>' attribute.
+	 * @see #setPublicID(String)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXDocument_PublicID()
+	 * @model
+	 * @generated
+	 */
+	String getPublicID();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getPublicID <em>Public ID</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Public ID</em>' attribute.
+	 * @see #getPublicID()
+	 * @generated
+	 */
+	void setPublicID(String value);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	boolean canInsertFragment(int offset, VEXDocumentFragment fragment);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	boolean canInsertText(int offset);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	Position createPosition(int offset);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model exceptions="org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.DocumentValidationException"
+	 * @generated
+	 */
+	void delete(int startOffset, int endOffset) throws DocumentValidationException;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	VEXElement findCommonElement(int offset1, int offset2);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	char getCharacterAt(int offset);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	VEXElement getElementAt(int offset);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	VEXDocumentFragment getFragment(int startOffset, int endOffset);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	EList<String> getNodeNames(int startOffset, int endOffset);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	EList<VEXNode> getNodes(int startOffset, int endOffset);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	String getRawText(int startOffset, int endOffset);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	String getText(int startOffset, int endOffset);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model exceptions="org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.DocumentValidationException"
+	 * @generated
+	 */
+	void insertElement(int offset, VEXElement defaults) throws DocumentValidationException;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model exceptions="org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.DocumentValidationException"
+	 * @generated
+	 */
+	void insertFragment(int offset, VEXDocumentFragment fragment) throws DocumentValidationException;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model exceptions="org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.DocumentValidationException"
+	 * @generated
+	 */
+	void insertText(int offset, String text) throws DocumentValidationException;
+
+} // VEXDocument
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/VEXDocumentFragment.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/VEXDocumentFragment.java
new file mode 100644
index 0000000..aed3e37
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/VEXDocumentFragment.java
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.I;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>VEX Document Fragment</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment#getContent <em>Content</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment#getLength <em>Length</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment#getElements <em>Elements</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment#getNodeNames <em>Node Names</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment#getNodes <em>Nodes</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXDocumentFragment()
+ * @model
+ * @generated
+ */
+public interface VEXDocumentFragment extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Content</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Content</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Content</em>' reference.
+	 * @see #setContent(Content)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXDocumentFragment_Content()
+	 * @model
+	 * @generated
+	 */
+	Content getContent();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment#getContent <em>Content</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Content</em>' reference.
+	 * @see #getContent()
+	 * @generated
+	 */
+	void setContent(Content value);
+
+	/**
+	 * Returns the value of the '<em><b>Length</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Length</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Length</em>' attribute.
+	 * @see #setLength(int)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXDocumentFragment_Length()
+	 * @model
+	 * @generated
+	 */
+	int getLength();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment#getLength <em>Length</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Length</em>' attribute.
+	 * @see #getLength()
+	 * @generated
+	 */
+	void setLength(int value);
+
+	/**
+	 * Returns the value of the '<em><b>Elements</b></em>' reference list.
+	 * The list contents are of type {@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Elements</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>Elements</em>' reference list.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXDocumentFragment_Elements()
+	 * @model
+	 * @generated
+	 */
+	EList<VEXElement> getElements();
+
+	/**
+	 * Returns the value of the '<em><b>Node Names</b></em>' attribute list.
+	 * The list contents are of type {@link java.lang.String}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Node Names</em>' attribute list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Node Names</em>' attribute list.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXDocumentFragment_NodeNames()
+	 * @model
+	 * @generated
+	 */
+	EList<String> getNodeNames();
+
+	/**
+	 * Returns the value of the '<em><b>Nodes</b></em>' reference list.
+	 * The list contents are of type {@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Nodes</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>Nodes</em>' reference list.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXDocumentFragment_Nodes()
+	 * @model
+	 * @generated
+	 */
+	EList<VEXNode> getNodes();
+
+} // VEXDocumentFragment
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/VEXElement.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/VEXElement.java
new file mode 100644
index 0000000..d70bce9
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/VEXElement.java
@@ -0,0 +1,310 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.I;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.wst.xml.vex.core.internal.dom.DocumentValidationException;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>VEX Element</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getAttributeNames <em>Attribute Names</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getChildElements <em>Child Elements</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getChildNodes <em>Child Nodes</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getDocument <em>Document</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#isEmpty <em>Empty</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getParent <em>Parent</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getNamespacePrefix <em>Namespace Prefix</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getNamespaceURI <em>Namespace URI</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXElement()
+ * @model
+ * @generated
+ */
+public interface VEXElement extends VEXNode {
+	/**
+	 * Returns the value of the '<em><b>Attribute Names</b></em>' attribute list.
+	 * The list contents are of type {@link java.lang.String}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Attribute Names</em>' attribute list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Attribute Names</em>' attribute list.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXElement_AttributeNames()
+	 * @model
+	 * @generated
+	 */
+	EList<String> getAttributeNames();
+
+	/**
+	 * Returns the value of the '<em><b>Child Elements</b></em>' reference list.
+	 * The list contents are of type {@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Child Elements</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>Child Elements</em>' reference list.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXElement_ChildElements()
+	 * @model
+	 * @generated
+	 */
+	EList<VEXElement> getChildElements();
+
+	/**
+	 * Returns the value of the '<em><b>Child Nodes</b></em>' reference list.
+	 * The list contents are of type {@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Child Nodes</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>Child Nodes</em>' reference list.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXElement_ChildNodes()
+	 * @model
+	 * @generated
+	 */
+	EList<VEXNode> getChildNodes();
+
+	/**
+	 * Returns the value of the '<em><b>Document</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Document</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Document</em>' reference.
+	 * @see #setDocument(VEXDocument)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXElement_Document()
+	 * @model
+	 * @generated
+	 */
+	VEXDocument getDocument();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getDocument <em>Document</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Document</em>' reference.
+	 * @see #getDocument()
+	 * @generated
+	 */
+	void setDocument(VEXDocument value);
+
+	/**
+	 * 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.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXElement_Name()
+	 * @model
+	 * @generated
+	 */
+	String getName();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#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>Empty</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Empty</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Empty</em>' attribute.
+	 * @see #setEmpty(boolean)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXElement_Empty()
+	 * @model
+	 * @generated
+	 */
+	boolean isEmpty();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#isEmpty <em>Empty</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Empty</em>' attribute.
+	 * @see #isEmpty()
+	 * @generated
+	 */
+	void setEmpty(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Parent</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Parent</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Parent</em>' reference.
+	 * @see #setParent(VEXElement)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXElement_Parent()
+	 * @model
+	 * @generated
+	 */
+	VEXElement getParent();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getParent <em>Parent</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Parent</em>' reference.
+	 * @see #getParent()
+	 * @generated
+	 */
+	void setParent(VEXElement value);
+
+	/**
+	 * Returns the value of the '<em><b>Namespace Prefix</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Namespace Prefix</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Namespace Prefix</em>' attribute.
+	 * @see #setNamespacePrefix(String)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXElement_NamespacePrefix()
+	 * @model
+	 * @generated
+	 */
+	String getNamespacePrefix();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getNamespacePrefix <em>Namespace Prefix</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Namespace Prefix</em>' attribute.
+	 * @see #getNamespacePrefix()
+	 * @generated
+	 */
+	void setNamespacePrefix(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Namespace URI</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Namespace URI</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Namespace URI</em>' attribute.
+	 * @see #setNamespaceURI(String)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXElement_NamespaceURI()
+	 * @model
+	 * @generated
+	 */
+	String getNamespaceURI();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getNamespaceURI <em>Namespace URI</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Namespace URI</em>' attribute.
+	 * @see #getNamespaceURI()
+	 * @generated
+	 */
+	void setNamespaceURI(String value);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	void addChild(VEXElement child);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	Object clone();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	String getAttribute(String name);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model exceptions="org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.DocumentValidationException"
+	 * @generated
+	 */
+	void removeAttribute(String name) throws DocumentValidationException;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model exceptions="org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.DocumentValidationException"
+	 * @generated
+	 */
+	void setAttribute(String name, String value) throws DocumentValidationException;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	void setContent(Content content, int offset, int i);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	void insertChild(int index, VEXElement child);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	void setNamespace(String prefix, String namespaceURI);
+
+} // VEXElement
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/VEXNode.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/VEXNode.java
new file mode 100644
index 0000000..1b7aef5
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/VEXNode.java
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.I;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>VEX Node</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getContent <em>Content</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getEndOffset <em>End Offset</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getEndPosition <em>End Position</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getStartOffset <em>Start Offset</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getStartPosition <em>Start Position</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getText <em>Text</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXNode()
+ * @model
+ * @generated
+ */
+public interface VEXNode extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Content</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Content</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Content</em>' reference.
+	 * @see #setContent(Content)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXNode_Content()
+	 * @model
+	 * @generated
+	 */
+	Content getContent();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getContent <em>Content</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Content</em>' reference.
+	 * @see #getContent()
+	 * @generated
+	 */
+	void setContent(Content value);
+
+	/**
+	 * Returns the value of the '<em><b>End Offset</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>End Offset</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>End Offset</em>' attribute.
+	 * @see #setEndOffset(int)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXNode_EndOffset()
+	 * @model
+	 * @generated
+	 */
+	int getEndOffset();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getEndOffset <em>End Offset</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>End Offset</em>' attribute.
+	 * @see #getEndOffset()
+	 * @generated
+	 */
+	void setEndOffset(int value);
+
+	/**
+	 * Returns the value of the '<em><b>End Position</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>End Position</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>End Position</em>' reference.
+	 * @see #setEndPosition(Position)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXNode_EndPosition()
+	 * @model
+	 * @generated
+	 */
+	Position getEndPosition();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getEndPosition <em>End Position</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>End Position</em>' reference.
+	 * @see #getEndPosition()
+	 * @generated
+	 */
+	void setEndPosition(Position value);
+
+	/**
+	 * Returns the value of the '<em><b>Start Offset</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Start Offset</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Start Offset</em>' attribute.
+	 * @see #setStartOffset(int)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXNode_StartOffset()
+	 * @model
+	 * @generated
+	 */
+	int getStartOffset();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getStartOffset <em>Start Offset</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Start Offset</em>' attribute.
+	 * @see #getStartOffset()
+	 * @generated
+	 */
+	void setStartOffset(int value);
+
+	/**
+	 * Returns the value of the '<em><b>Start Position</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Start Position</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Start Position</em>' reference.
+	 * @see #setStartPosition(Position)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXNode_StartPosition()
+	 * @model
+	 * @generated
+	 */
+	Position getStartPosition();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getStartPosition <em>Start Position</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Start Position</em>' reference.
+	 * @see #getStartPosition()
+	 * @generated
+	 */
+	void setStartPosition(Position value);
+
+	/**
+	 * Returns the value of the '<em><b>Text</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Text</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Text</em>' attribute.
+	 * @see #setText(String)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXNode_Text()
+	 * @model
+	 * @generated
+	 */
+	String getText();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode#getText <em>Text</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Text</em>' attribute.
+	 * @see #getText()
+	 * @generated
+	 */
+	void setText(String value);
+
+} // VEXNode
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/VEXProcessingInstruction.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/VEXProcessingInstruction.java
new file mode 100644
index 0000000..f6629c8
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/VEXProcessingInstruction.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.I;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>VEX Processing Instruction</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXProcessingInstruction#getAttributes <em>Attributes</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXProcessingInstruction()
+ * @model
+ * @generated
+ */
+public interface VEXProcessingInstruction extends VEXNode {
+	/**
+	 * Returns the value of the '<em><b>Attributes</b></em>' reference list.
+	 * The list contents are of type {@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute}.
+	 * <!-- 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>' reference list.
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getVEXProcessingInstruction_Attributes()
+	 * @model
+	 * @generated
+	 */
+	EList<VEXAttribute> getAttributes();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	boolean removeAttribute(String attributeName);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model
+	 * @generated
+	 */
+	void setAttribute(String attributeName, String value);
+
+} // VEXProcessingInstruction
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/Validator.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/Validator.java
new file mode 100644
index 0000000..5e2467e
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/I/Validator.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.I;
+
+import java.io.Serializable;
+
+import java.util.Set;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+import org.eclipse.wst.xml.vex.core.internal.validator.AttributeDefinition;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Validator</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator#getValidRootElements <em>Valid Root Elements</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getValidator()
+ * @model superTypes="org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Serializable"
+ * @generated
+ */
+public interface Validator extends EObject, Serializable {
+	/**
+	 * Returns the value of the '<em><b>Valid Root Elements</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Valid Root Elements</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Valid Root Elements</em>' attribute.
+	 * @see #setValidRootElements(Set)
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#getValidator_ValidRootElements()
+	 * @model dataType="org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Set"
+	 * @generated
+	 */
+	Set getValidRootElements();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator#getValidRootElements <em>Valid Root Elements</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Valid Root Elements</em>' attribute.
+	 * @see #getValidRootElements()
+	 * @generated
+	 */
+	void setValidRootElements(Set value);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model dataType="org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.AttributeDefinition"
+	 * @generated
+	 */
+	AttributeDefinition getAttributeDefinition(String element, String attribute);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model dataType="org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.AttributeDefinition"
+	 * @generated
+	 */
+	EList<AttributeDefinition> getAttributeDefinitions(String element);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model dataType="org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Set<org.eclipse.emf.ecore.EString>"
+	 * @generated
+	 */
+	Set<String> getValidItems(String element);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model nodesMany="true"
+	 * @generated
+	 */
+	boolean isValidSequence(String element, EList<String> nodes, boolean partial);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model seq1Many="true" seq2Many="true" seq3Many="true"
+	 * @generated
+	 */
+	boolean isValidSequence(String element, EList<String> seq1, EList<String> seq2, EList<String> seq3, boolean partial);
+
+} // Validator
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/ContentImpl.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/ContentImpl.java
new file mode 100644
index 0000000..25c96c0
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/ContentImpl.java
@@ -0,0 +1,217 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.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.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Position;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Content</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.ContentImpl#getLength <em>Length</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ContentImpl extends EObjectImpl implements Content {
+	/**
+	 * The default value of the '{@link #getLength() <em>Length</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLength()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int LENGTH_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getLength() <em>Length</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLength()
+	 * @generated
+	 * @ordered
+	 */
+	protected int length = LENGTH_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ContentImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DomEMFPackage.Literals.CONTENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getLength() {
+		return length;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setLength(int newLength) {
+		int oldLength = length;
+		length = newLength;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.CONTENT__LENGTH, oldLength, length));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Position createPosition(int offset) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void insertString(int offset, String s) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void remove(int offset, int length) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getString(int offset, int length) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DomEMFPackage.CONTENT__LENGTH:
+				return new Integer(getLength());
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DomEMFPackage.CONTENT__LENGTH:
+				setLength(((Integer)newValue).intValue());
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DomEMFPackage.CONTENT__LENGTH:
+				setLength(LENGTH_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DomEMFPackage.CONTENT__LENGTH:
+				return length != LENGTH_EDEFAULT;
+		}
+		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(" (length: ");
+		result.append(length);
+		result.append(')');
+		return result.toString();
+	}
+
+} //ContentImpl
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/DomEMFFactoryImpl.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/DomEMFFactoryImpl.java
new file mode 100644
index 0000000..c76f923
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/DomEMFFactoryImpl.java
@@ -0,0 +1,304 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl;
+
+import java.util.Set;
+
+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.wst.xml.vex.core.internal.dom.DocumentValidationException;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFFactory;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.*;
+
+import org.eclipse.wst.xml.vex.core.internal.validator.AttributeDefinition;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class DomEMFFactoryImpl extends EFactoryImpl implements DomEMFFactory {
+	/**
+	 * Creates the default factory implementation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static DomEMFFactory init() {
+		try {
+			DomEMFFactory theDomEMFFactory = (DomEMFFactory)EPackage.Registry.INSTANCE.getEFactory("http:///org/eclipse/wst/xml/vex/core/internal/provisional/dom.ecore"); 
+			if (theDomEMFFactory != null) {
+				return theDomEMFFactory;
+			}
+		}
+		catch (Exception exception) {
+			EcorePlugin.INSTANCE.log(exception);
+		}
+		return new DomEMFFactoryImpl();
+	}
+
+	/**
+	 * Creates an instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DomEMFFactoryImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EObject create(EClass eClass) {
+		switch (eClass.getClassifierID()) {
+			case DomEMFPackage.CONTENT: return createContent();
+			case DomEMFPackage.POSITION: return createPosition();
+			case DomEMFPackage.VEX_ATTRIBUTE: return createVEXAttribute();
+			case DomEMFPackage.VEX_COMMENT: return createVEXComment();
+			case DomEMFPackage.VEX_DOCUMENT: return createVEXDocument();
+			case DomEMFPackage.VEX_DOCUMENT_FRAGMENT: return createVEXDocumentFragment();
+			case DomEMFPackage.VEX_ELEMENT: return createVEXElement();
+			case DomEMFPackage.VEX_NODE: return createVEXNode();
+			case DomEMFPackage.VEX_PROCESSING_INSTRUCTION: return createVEXProcessingInstruction();
+			case DomEMFPackage.VALIDATOR: return createValidator();
+			default:
+				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object createFromString(EDataType eDataType, String initialValue) {
+		switch (eDataType.getClassifierID()) {
+			case DomEMFPackage.DOCUMENT_VALIDATION_EXCEPTION:
+				return createDocumentValidationExceptionFromString(eDataType, initialValue);
+			case DomEMFPackage.ATTRIBUTE_DEFINITION:
+				return createAttributeDefinitionFromString(eDataType, initialValue);
+			case DomEMFPackage.SET:
+				return createSetFromString(eDataType, initialValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String convertToString(EDataType eDataType, Object instanceValue) {
+		switch (eDataType.getClassifierID()) {
+			case DomEMFPackage.DOCUMENT_VALIDATION_EXCEPTION:
+				return convertDocumentValidationExceptionToString(eDataType, instanceValue);
+			case DomEMFPackage.ATTRIBUTE_DEFINITION:
+				return convertAttributeDefinitionToString(eDataType, instanceValue);
+			case DomEMFPackage.SET:
+				return convertSetToString(eDataType, instanceValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Content createContent() {
+		ContentImpl content = new ContentImpl();
+		return content;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Position createPosition() {
+		PositionImpl position = new PositionImpl();
+		return position;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXAttribute createVEXAttribute() {
+		VEXAttributeImpl vexAttribute = new VEXAttributeImpl();
+		return vexAttribute;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXComment createVEXComment() {
+		VEXCommentImpl vexComment = new VEXCommentImpl();
+		return vexComment;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXDocument createVEXDocument() {
+		VEXDocumentImpl vexDocument = new VEXDocumentImpl();
+		return vexDocument;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXDocumentFragment createVEXDocumentFragment() {
+		VEXDocumentFragmentImpl vexDocumentFragment = new VEXDocumentFragmentImpl();
+		return vexDocumentFragment;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXElement createVEXElement() {
+		VEXElementImpl vexElement = new VEXElementImpl();
+		return vexElement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXNode createVEXNode() {
+		VEXNodeImpl vexNode = new VEXNodeImpl();
+		return vexNode;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXProcessingInstruction createVEXProcessingInstruction() {
+		VEXProcessingInstructionImpl vexProcessingInstruction = new VEXProcessingInstructionImpl();
+		return vexProcessingInstruction;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Validator createValidator() {
+		ValidatorImpl validator = new ValidatorImpl();
+		return validator;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DocumentValidationException createDocumentValidationExceptionFromString(EDataType eDataType, String initialValue) {
+		return (DocumentValidationException)super.createFromString(eDataType, initialValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertDocumentValidationExceptionToString(EDataType eDataType, Object instanceValue) {
+		return super.convertToString(eDataType, instanceValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public AttributeDefinition createAttributeDefinitionFromString(EDataType eDataType, String initialValue) {
+		return (AttributeDefinition)super.createFromString(eDataType, initialValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertAttributeDefinitionToString(EDataType eDataType, Object instanceValue) {
+		return super.convertToString(eDataType, instanceValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Set<?> createSetFromString(EDataType eDataType, String initialValue) {
+		return (Set<?>)super.createFromString(initialValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertSetToString(EDataType eDataType, Object instanceValue) {
+		return super.convertToString(instanceValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DomEMFPackage getDomEMFPackage() {
+		return (DomEMFPackage)getEPackage();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @deprecated
+	 * @generated
+	 */
+	@Deprecated
+	public static DomEMFPackage getPackage() {
+		return DomEMFPackage.eINSTANCE;
+	}
+
+} //DomEMFFactoryImpl
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/DomEMFPackageImpl.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/DomEMFPackageImpl.java
new file mode 100644
index 0000000..22ef5a4
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/DomEMFPackageImpl.java
@@ -0,0 +1,1005 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl;
+
+import java.io.Serializable;
+
+import java.util.Set;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EGenericType;
+import org.eclipse.emf.ecore.EOperation;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+
+import org.eclipse.wst.xml.vex.core.internal.dom.DocumentValidationException;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFFactory;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Position;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXComment;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXProcessingInstruction;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator;
+
+import org.eclipse.wst.xml.vex.core.internal.validator.AttributeDefinition;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class DomEMFPackageImpl extends EPackageImpl implements DomEMFPackage {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass contentEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass positionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass vexAttributeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass vexCommentEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass vexDocumentEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass vexDocumentFragmentEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass vexElementEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass vexNodeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass vexProcessingInstructionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass validatorEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass serializableEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EDataType documentValidationExceptionEDataType = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EDataType attributeDefinitionEDataType = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EDataType setEDataType = 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.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage#eNS_URI
+	 * @see #init()
+	 * @generated
+	 */
+	private DomEMFPackageImpl() {
+		super(eNS_URI, DomEMFFactory.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 -->
+	 * <!-- end-user-doc -->
+	 * @see #eNS_URI
+	 * @see #createPackageContents()
+	 * @see #initializePackageContents()
+	 * @generated
+	 */
+	public static DomEMFPackage init() {
+		if (isInited) return (DomEMFPackage)EPackage.Registry.INSTANCE.getEPackage(DomEMFPackage.eNS_URI);
+
+		// Obtain or create and register package
+		DomEMFPackageImpl theDomEMFPackage = (DomEMFPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof DomEMFPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new DomEMFPackageImpl());
+
+		isInited = true;
+
+		// Create package meta-data objects
+		theDomEMFPackage.createPackageContents();
+
+		// Initialize created meta-data
+		theDomEMFPackage.initializePackageContents();
+
+		// Mark meta-data to indicate it can't be changed
+		theDomEMFPackage.freeze();
+
+		return theDomEMFPackage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getContent() {
+		return contentEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getContent_Length() {
+		return (EAttribute)contentEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getPosition() {
+		return positionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getPosition_Offset() {
+		return (EAttribute)positionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getVEXAttribute() {
+		return vexAttributeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getVEXAttribute_Document() {
+		return (EReference)vexAttributeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getVEXAttribute_Value() {
+		return (EAttribute)vexAttributeEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getVEXAttribute_Parent() {
+		return (EReference)vexAttributeEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getVEXAttribute_LocalName() {
+		return (EAttribute)vexAttributeEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getVEXAttribute_NamespacePrefix() {
+		return (EAttribute)vexAttributeEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getVEXAttribute_NamespaceURI() {
+		return (EAttribute)vexAttributeEClass.getEStructuralFeatures().get(5);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getVEXComment() {
+		return vexCommentEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getVEXComment_Value() {
+		return (EAttribute)vexCommentEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getVEXDocument() {
+		return vexDocumentEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getVEXDocument_Encoding() {
+		return (EAttribute)vexDocumentEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getVEXDocument_Length() {
+		return (EAttribute)vexDocumentEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getVEXDocument_RootElement() {
+		return (EReference)vexDocumentEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getVEXDocument_Validator() {
+		return (EReference)vexDocumentEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getVEXDocument_PublicID() {
+		return (EAttribute)vexDocumentEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getVEXDocumentFragment() {
+		return vexDocumentFragmentEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getVEXDocumentFragment_Content() {
+		return (EReference)vexDocumentFragmentEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getVEXDocumentFragment_Length() {
+		return (EAttribute)vexDocumentFragmentEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getVEXDocumentFragment_Elements() {
+		return (EReference)vexDocumentFragmentEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getVEXDocumentFragment_NodeNames() {
+		return (EAttribute)vexDocumentFragmentEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getVEXDocumentFragment_Nodes() {
+		return (EReference)vexDocumentFragmentEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getVEXElement() {
+		return vexElementEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getVEXElement_AttributeNames() {
+		return (EAttribute)vexElementEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getVEXElement_ChildElements() {
+		return (EReference)vexElementEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getVEXElement_ChildNodes() {
+		return (EReference)vexElementEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getVEXElement_Document() {
+		return (EReference)vexElementEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getVEXElement_Name() {
+		return (EAttribute)vexElementEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getVEXElement_Empty() {
+		return (EAttribute)vexElementEClass.getEStructuralFeatures().get(5);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getVEXElement_Parent() {
+		return (EReference)vexElementEClass.getEStructuralFeatures().get(6);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getVEXElement_NamespacePrefix() {
+		return (EAttribute)vexElementEClass.getEStructuralFeatures().get(7);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getVEXElement_NamespaceURI() {
+		return (EAttribute)vexElementEClass.getEStructuralFeatures().get(8);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getVEXNode() {
+		return vexNodeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getVEXNode_Content() {
+		return (EReference)vexNodeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getVEXNode_EndOffset() {
+		return (EAttribute)vexNodeEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getVEXNode_EndPosition() {
+		return (EReference)vexNodeEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getVEXNode_StartOffset() {
+		return (EAttribute)vexNodeEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getVEXNode_StartPosition() {
+		return (EReference)vexNodeEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getVEXNode_Text() {
+		return (EAttribute)vexNodeEClass.getEStructuralFeatures().get(5);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getVEXProcessingInstruction() {
+		return vexProcessingInstructionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getVEXProcessingInstruction_Attributes() {
+		return (EReference)vexProcessingInstructionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getValidator() {
+		return validatorEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getValidator_ValidRootElements() {
+		return (EAttribute)validatorEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getSerializable() {
+		return serializableEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EDataType getDocumentValidationException() {
+		return documentValidationExceptionEDataType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EDataType getAttributeDefinition() {
+		return attributeDefinitionEDataType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EDataType getSet() {
+		return setEDataType;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DomEMFFactory getDomEMFFactory() {
+		return (DomEMFFactory)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
+		contentEClass = createEClass(CONTENT);
+		createEAttribute(contentEClass, CONTENT__LENGTH);
+
+		positionEClass = createEClass(POSITION);
+		createEAttribute(positionEClass, POSITION__OFFSET);
+
+		vexAttributeEClass = createEClass(VEX_ATTRIBUTE);
+		createEReference(vexAttributeEClass, VEX_ATTRIBUTE__DOCUMENT);
+		createEAttribute(vexAttributeEClass, VEX_ATTRIBUTE__VALUE);
+		createEReference(vexAttributeEClass, VEX_ATTRIBUTE__PARENT);
+		createEAttribute(vexAttributeEClass, VEX_ATTRIBUTE__LOCAL_NAME);
+		createEAttribute(vexAttributeEClass, VEX_ATTRIBUTE__NAMESPACE_PREFIX);
+		createEAttribute(vexAttributeEClass, VEX_ATTRIBUTE__NAMESPACE_URI);
+
+		vexCommentEClass = createEClass(VEX_COMMENT);
+		createEAttribute(vexCommentEClass, VEX_COMMENT__VALUE);
+
+		vexDocumentEClass = createEClass(VEX_DOCUMENT);
+		createEAttribute(vexDocumentEClass, VEX_DOCUMENT__ENCODING);
+		createEAttribute(vexDocumentEClass, VEX_DOCUMENT__LENGTH);
+		createEReference(vexDocumentEClass, VEX_DOCUMENT__ROOT_ELEMENT);
+		createEReference(vexDocumentEClass, VEX_DOCUMENT__VALIDATOR);
+		createEAttribute(vexDocumentEClass, VEX_DOCUMENT__PUBLIC_ID);
+
+		vexDocumentFragmentEClass = createEClass(VEX_DOCUMENT_FRAGMENT);
+		createEReference(vexDocumentFragmentEClass, VEX_DOCUMENT_FRAGMENT__CONTENT);
+		createEAttribute(vexDocumentFragmentEClass, VEX_DOCUMENT_FRAGMENT__LENGTH);
+		createEReference(vexDocumentFragmentEClass, VEX_DOCUMENT_FRAGMENT__ELEMENTS);
+		createEAttribute(vexDocumentFragmentEClass, VEX_DOCUMENT_FRAGMENT__NODE_NAMES);
+		createEReference(vexDocumentFragmentEClass, VEX_DOCUMENT_FRAGMENT__NODES);
+
+		vexElementEClass = createEClass(VEX_ELEMENT);
+		createEAttribute(vexElementEClass, VEX_ELEMENT__ATTRIBUTE_NAMES);
+		createEReference(vexElementEClass, VEX_ELEMENT__CHILD_ELEMENTS);
+		createEReference(vexElementEClass, VEX_ELEMENT__CHILD_NODES);
+		createEReference(vexElementEClass, VEX_ELEMENT__DOCUMENT);
+		createEAttribute(vexElementEClass, VEX_ELEMENT__NAME);
+		createEAttribute(vexElementEClass, VEX_ELEMENT__EMPTY);
+		createEReference(vexElementEClass, VEX_ELEMENT__PARENT);
+		createEAttribute(vexElementEClass, VEX_ELEMENT__NAMESPACE_PREFIX);
+		createEAttribute(vexElementEClass, VEX_ELEMENT__NAMESPACE_URI);
+
+		vexNodeEClass = createEClass(VEX_NODE);
+		createEReference(vexNodeEClass, VEX_NODE__CONTENT);
+		createEAttribute(vexNodeEClass, VEX_NODE__END_OFFSET);
+		createEReference(vexNodeEClass, VEX_NODE__END_POSITION);
+		createEAttribute(vexNodeEClass, VEX_NODE__START_OFFSET);
+		createEReference(vexNodeEClass, VEX_NODE__START_POSITION);
+		createEAttribute(vexNodeEClass, VEX_NODE__TEXT);
+
+		vexProcessingInstructionEClass = createEClass(VEX_PROCESSING_INSTRUCTION);
+		createEReference(vexProcessingInstructionEClass, VEX_PROCESSING_INSTRUCTION__ATTRIBUTES);
+
+		validatorEClass = createEClass(VALIDATOR);
+		createEAttribute(validatorEClass, VALIDATOR__VALID_ROOT_ELEMENTS);
+
+		serializableEClass = createEClass(SERIALIZABLE);
+
+		// Create data types
+		documentValidationExceptionEDataType = createEDataType(DOCUMENT_VALIDATION_EXCEPTION);
+		attributeDefinitionEDataType = createEDataType(ATTRIBUTE_DEFINITION);
+		setEDataType = createEDataType(SET);
+	}
+
+	/**
+	 * <!-- 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
+		addETypeParameter(setEDataType, "T");
+
+		// Set bounds for type parameters
+
+		// Add supertypes to classes
+		vexAttributeEClass.getESuperTypes().add(this.getVEXNode());
+		vexCommentEClass.getESuperTypes().add(this.getVEXNode());
+		vexElementEClass.getESuperTypes().add(this.getVEXNode());
+		vexProcessingInstructionEClass.getESuperTypes().add(this.getVEXNode());
+		validatorEClass.getESuperTypes().add(this.getSerializable());
+
+		// Initialize classes and features; add operations and parameters
+		initEClass(contentEClass, Content.class, "Content", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getContent_Length(), ecorePackage.getEInt(), "length", null, 0, 1, Content.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		EOperation op = addEOperation(contentEClass, this.getPosition(), "createPosition", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "offset", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		op = addEOperation(contentEClass, null, "insertString", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "offset", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEString(), "s", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		op = addEOperation(contentEClass, null, "remove", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "offset", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "length", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		op = addEOperation(contentEClass, ecorePackage.getEString(), "getString", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "offset", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "length", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		initEClass(positionEClass, Position.class, "Position", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getPosition_Offset(), ecorePackage.getEInt(), "offset", null, 0, 1, Position.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(vexAttributeEClass, VEXAttribute.class, "VEXAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getVEXAttribute_Document(), this.getVEXDocument(), null, "document", null, 0, 1, VEXAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getVEXAttribute_Value(), ecorePackage.getEString(), "value", null, 0, 1, VEXAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getVEXAttribute_Parent(), this.getVEXElement(), null, "parent", null, 0, 1, VEXAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getVEXAttribute_LocalName(), ecorePackage.getEString(), "localName", null, 0, 1, VEXAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getVEXAttribute_NamespacePrefix(), ecorePackage.getEString(), "namespacePrefix", null, 0, 1, VEXAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getVEXAttribute_NamespaceURI(), ecorePackage.getEString(), "namespaceURI", null, 0, 1, VEXAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		op = addEOperation(vexAttributeEClass, null, "setNamespace", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEString(), "prefix", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEString(), "namespaceURI", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		initEClass(vexCommentEClass, VEXComment.class, "VEXComment", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getVEXComment_Value(), ecorePackage.getEString(), "value", null, 0, 1, VEXComment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(vexDocumentEClass, VEXDocument.class, "VEXDocument", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getVEXDocument_Encoding(), ecorePackage.getEString(), "encoding", null, 0, 1, VEXDocument.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getVEXDocument_Length(), ecorePackage.getEInt(), "length", null, 0, 1, VEXDocument.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getVEXDocument_RootElement(), this.getVEXElement(), null, "rootElement", null, 0, 1, VEXDocument.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getVEXDocument_Validator(), this.getValidator(), null, "validator", null, 0, 1, VEXDocument.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getVEXDocument_PublicID(), ecorePackage.getEString(), "publicID", null, 0, 1, VEXDocument.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		op = addEOperation(vexDocumentEClass, ecorePackage.getEBoolean(), "canInsertFragment", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "offset", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, this.getVEXDocumentFragment(), "fragment", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		op = addEOperation(vexDocumentEClass, ecorePackage.getEBoolean(), "canInsertText", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "offset", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		op = addEOperation(vexDocumentEClass, this.getPosition(), "createPosition", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "offset", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		op = addEOperation(vexDocumentEClass, null, "delete", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "startOffset", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "endOffset", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEException(op, this.getDocumentValidationException());
+
+		op = addEOperation(vexDocumentEClass, this.getVEXElement(), "findCommonElement", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "offset1", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "offset2", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		op = addEOperation(vexDocumentEClass, ecorePackage.getEChar(), "getCharacterAt", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "offset", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		op = addEOperation(vexDocumentEClass, this.getVEXElement(), "getElementAt", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "offset", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		op = addEOperation(vexDocumentEClass, this.getVEXDocumentFragment(), "getFragment", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "startOffset", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "endOffset", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		op = addEOperation(vexDocumentEClass, ecorePackage.getEString(), "getNodeNames", 0, -1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "startOffset", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "endOffset", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		op = addEOperation(vexDocumentEClass, this.getVEXNode(), "getNodes", 0, -1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "startOffset", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "endOffset", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		op = addEOperation(vexDocumentEClass, ecorePackage.getEString(), "getRawText", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "startOffset", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "endOffset", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		op = addEOperation(vexDocumentEClass, ecorePackage.getEString(), "getText", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "startOffset", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "endOffset", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		op = addEOperation(vexDocumentEClass, null, "insertElement", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "offset", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, this.getVEXElement(), "defaults", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEException(op, this.getDocumentValidationException());
+
+		op = addEOperation(vexDocumentEClass, null, "insertFragment", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "offset", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, this.getVEXDocumentFragment(), "fragment", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEException(op, this.getDocumentValidationException());
+
+		op = addEOperation(vexDocumentEClass, null, "insertText", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "offset", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEString(), "text", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEException(op, this.getDocumentValidationException());
+
+		initEClass(vexDocumentFragmentEClass, VEXDocumentFragment.class, "VEXDocumentFragment", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getVEXDocumentFragment_Content(), this.getContent(), null, "content", null, 0, 1, VEXDocumentFragment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getVEXDocumentFragment_Length(), ecorePackage.getEInt(), "length", null, 0, 1, VEXDocumentFragment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getVEXDocumentFragment_Elements(), this.getVEXElement(), null, "elements", null, 0, -1, VEXDocumentFragment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getVEXDocumentFragment_NodeNames(), ecorePackage.getEString(), "nodeNames", null, 0, -1, VEXDocumentFragment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getVEXDocumentFragment_Nodes(), this.getVEXNode(), null, "nodes", null, 0, -1, VEXDocumentFragment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(vexElementEClass, VEXElement.class, "VEXElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getVEXElement_AttributeNames(), ecorePackage.getEString(), "attributeNames", null, 0, -1, VEXElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getVEXElement_ChildElements(), this.getVEXElement(), null, "childElements", null, 0, -1, VEXElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getVEXElement_ChildNodes(), this.getVEXNode(), null, "childNodes", null, 0, -1, VEXElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getVEXElement_Document(), this.getVEXDocument(), null, "document", null, 0, 1, VEXElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getVEXElement_Name(), ecorePackage.getEString(), "name", null, 0, 1, VEXElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getVEXElement_Empty(), ecorePackage.getEBoolean(), "empty", null, 0, 1, VEXElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getVEXElement_Parent(), this.getVEXElement(), null, "parent", null, 0, 1, VEXElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getVEXElement_NamespacePrefix(), ecorePackage.getEString(), "namespacePrefix", null, 0, 1, VEXElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getVEXElement_NamespaceURI(), ecorePackage.getEString(), "namespaceURI", null, 0, 1, VEXElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		op = addEOperation(vexElementEClass, null, "addChild", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, this.getVEXElement(), "child", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		addEOperation(vexElementEClass, ecorePackage.getEJavaObject(), "clone", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		op = addEOperation(vexElementEClass, ecorePackage.getEString(), "getAttribute", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEString(), "name", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		op = addEOperation(vexElementEClass, null, "removeAttribute", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEString(), "name", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEException(op, this.getDocumentValidationException());
+
+		op = addEOperation(vexElementEClass, null, "setAttribute", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEString(), "name", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEString(), "value", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEException(op, this.getDocumentValidationException());
+
+		op = addEOperation(vexElementEClass, null, "setContent", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, this.getContent(), "content", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "offset", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "i", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		op = addEOperation(vexElementEClass, null, "insertChild", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEInt(), "index", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, this.getVEXElement(), "child", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		op = addEOperation(vexElementEClass, null, "setNamespace", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEString(), "prefix", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEString(), "namespaceURI", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		initEClass(vexNodeEClass, VEXNode.class, "VEXNode", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getVEXNode_Content(), this.getContent(), null, "content", null, 0, 1, VEXNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getVEXNode_EndOffset(), ecorePackage.getEInt(), "endOffset", null, 0, 1, VEXNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getVEXNode_EndPosition(), this.getPosition(), null, "endPosition", null, 0, 1, VEXNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getVEXNode_StartOffset(), ecorePackage.getEInt(), "startOffset", null, 0, 1, VEXNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getVEXNode_StartPosition(), this.getPosition(), null, "startPosition", null, 0, 1, VEXNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getVEXNode_Text(), ecorePackage.getEString(), "text", null, 0, 1, VEXNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(vexProcessingInstructionEClass, VEXProcessingInstruction.class, "VEXProcessingInstruction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getVEXProcessingInstruction_Attributes(), this.getVEXAttribute(), null, "attributes", null, 0, -1, VEXProcessingInstruction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		op = addEOperation(vexProcessingInstructionEClass, ecorePackage.getEBoolean(), "removeAttribute", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEString(), "attributeName", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		op = addEOperation(vexProcessingInstructionEClass, null, "setAttribute", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEString(), "attributeName", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEString(), "value", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		initEClass(validatorEClass, Validator.class, "Validator", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getValidator_ValidRootElements(), this.getSet(), "validRootElements", null, 0, 1, Validator.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		op = addEOperation(validatorEClass, this.getAttributeDefinition(), "getAttributeDefinition", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEString(), "element", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEString(), "attribute", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		op = addEOperation(validatorEClass, this.getAttributeDefinition(), "getAttributeDefinitions", 0, -1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEString(), "element", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		op = addEOperation(validatorEClass, null, "getValidItems", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEString(), "element", 0, 1, IS_UNIQUE, IS_ORDERED);
+		EGenericType g1 = createEGenericType(this.getSet());
+		EGenericType g2 = createEGenericType(ecorePackage.getEString());
+		g1.getETypeArguments().add(g2);
+		initEOperation(op, g1);
+
+		op = addEOperation(validatorEClass, ecorePackage.getEBoolean(), "isValidSequence", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEString(), "element", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEString(), "nodes", 0, -1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEBoolean(), "partial", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		op = addEOperation(validatorEClass, ecorePackage.getEBoolean(), "isValidSequence", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEString(), "element", 0, 1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEString(), "seq1", 0, -1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEString(), "seq2", 0, -1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEString(), "seq3", 0, -1, IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, ecorePackage.getEBoolean(), "partial", 0, 1, IS_UNIQUE, IS_ORDERED);
+
+		initEClass(serializableEClass, Serializable.class, "Serializable", IS_ABSTRACT, IS_INTERFACE, !IS_GENERATED_INSTANCE_CLASS);
+
+		// Initialize data types
+		initEDataType(documentValidationExceptionEDataType, DocumentValidationException.class, "DocumentValidationException", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
+		initEDataType(attributeDefinitionEDataType, AttributeDefinition.class, "AttributeDefinition", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
+		initEDataType(setEDataType, Set.class, "Set", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
+
+		// Create resource
+		createResource(eNS_URI);
+	}
+
+} //DomEMFPackageImpl
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/PositionImpl.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/PositionImpl.java
new file mode 100644
index 0000000..89b4ff0
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/PositionImpl.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.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.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Position;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Position</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.PositionImpl#getOffset <em>Offset</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class PositionImpl extends EObjectImpl implements Position {
+	/**
+	 * The default value of the '{@link #getOffset() <em>Offset</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOffset()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int OFFSET_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getOffset() <em>Offset</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOffset()
+	 * @generated
+	 * @ordered
+	 */
+	protected int offset = OFFSET_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected PositionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DomEMFPackage.Literals.POSITION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getOffset() {
+		return offset;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setOffset(int newOffset) {
+		int oldOffset = offset;
+		offset = newOffset;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.POSITION__OFFSET, oldOffset, offset));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DomEMFPackage.POSITION__OFFSET:
+				return new Integer(getOffset());
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DomEMFPackage.POSITION__OFFSET:
+				setOffset(((Integer)newValue).intValue());
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DomEMFPackage.POSITION__OFFSET:
+				setOffset(OFFSET_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DomEMFPackage.POSITION__OFFSET:
+				return offset != OFFSET_EDEFAULT;
+		}
+		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(" (offset: ");
+		result.append(offset);
+		result.append(')');
+		return result.toString();
+	}
+
+} //PositionImpl
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/VEXAttributeImpl.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/VEXAttributeImpl.java
new file mode 100644
index 0000000..88717e8
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/VEXAttributeImpl.java
@@ -0,0 +1,467 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>VEX Attribute</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXAttributeImpl#getDocument <em>Document</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXAttributeImpl#getValue <em>Value</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXAttributeImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXAttributeImpl#getLocalName <em>Local Name</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXAttributeImpl#getNamespacePrefix <em>Namespace Prefix</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXAttributeImpl#getNamespaceURI <em>Namespace URI</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class VEXAttributeImpl extends VEXNodeImpl implements VEXAttribute {
+	/**
+	 * The cached value of the '{@link #getDocument() <em>Document</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDocument()
+	 * @generated
+	 * @ordered
+	 */
+	protected VEXDocument document;
+
+	/**
+	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String VALUE_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected String value = VALUE_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getParent()
+	 * @generated
+	 * @ordered
+	 */
+	protected VEXElement parent;
+
+	/**
+	 * The default value of the '{@link #getLocalName() <em>Local Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLocalName()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String LOCAL_NAME_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getLocalName() <em>Local Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLocalName()
+	 * @generated
+	 * @ordered
+	 */
+	protected String localName = LOCAL_NAME_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getNamespacePrefix() <em>Namespace Prefix</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getNamespacePrefix()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String NAMESPACE_PREFIX_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getNamespacePrefix() <em>Namespace Prefix</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getNamespacePrefix()
+	 * @generated
+	 * @ordered
+	 */
+	protected String namespacePrefix = NAMESPACE_PREFIX_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getNamespaceURI() <em>Namespace URI</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getNamespaceURI()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String NAMESPACE_URI_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getNamespaceURI() <em>Namespace URI</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getNamespaceURI()
+	 * @generated
+	 * @ordered
+	 */
+	protected String namespaceURI = NAMESPACE_URI_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected VEXAttributeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DomEMFPackage.Literals.VEX_ATTRIBUTE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXDocument getDocument() {
+		if (document != null && document.eIsProxy()) {
+			InternalEObject oldDocument = (InternalEObject)document;
+			document = (VEXDocument)eResolveProxy(oldDocument);
+			if (document != oldDocument) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, DomEMFPackage.VEX_ATTRIBUTE__DOCUMENT, oldDocument, document));
+			}
+		}
+		return document;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXDocument basicGetDocument() {
+		return document;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDocument(VEXDocument newDocument) {
+		VEXDocument oldDocument = document;
+		document = newDocument;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_ATTRIBUTE__DOCUMENT, oldDocument, document));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(String newValue) {
+		String oldValue = value;
+		value = newValue;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_ATTRIBUTE__VALUE, oldValue, value));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXElement getParent() {
+		if (parent != null && parent.eIsProxy()) {
+			InternalEObject oldParent = (InternalEObject)parent;
+			parent = (VEXElement)eResolveProxy(oldParent);
+			if (parent != oldParent) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, DomEMFPackage.VEX_ATTRIBUTE__PARENT, oldParent, parent));
+			}
+		}
+		return parent;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXElement basicGetParent() {
+		return parent;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setParent(VEXElement newParent) {
+		VEXElement oldParent = parent;
+		parent = newParent;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_ATTRIBUTE__PARENT, oldParent, parent));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLocalName() {
+		return localName;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setLocalName(String newLocalName) {
+		String oldLocalName = localName;
+		localName = newLocalName;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_ATTRIBUTE__LOCAL_NAME, oldLocalName, localName));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getNamespacePrefix() {
+		return namespacePrefix;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setNamespacePrefix(String newNamespacePrefix) {
+		String oldNamespacePrefix = namespacePrefix;
+		namespacePrefix = newNamespacePrefix;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_ATTRIBUTE__NAMESPACE_PREFIX, oldNamespacePrefix, namespacePrefix));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getNamespaceURI() {
+		return namespaceURI;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setNamespaceURI(String newNamespaceURI) {
+		String oldNamespaceURI = namespaceURI;
+		namespaceURI = newNamespaceURI;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_ATTRIBUTE__NAMESPACE_URI, oldNamespaceURI, namespaceURI));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setNamespace(String prefix, String namespaceURI) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_ATTRIBUTE__DOCUMENT:
+				if (resolve) return getDocument();
+				return basicGetDocument();
+			case DomEMFPackage.VEX_ATTRIBUTE__VALUE:
+				return getValue();
+			case DomEMFPackage.VEX_ATTRIBUTE__PARENT:
+				if (resolve) return getParent();
+				return basicGetParent();
+			case DomEMFPackage.VEX_ATTRIBUTE__LOCAL_NAME:
+				return getLocalName();
+			case DomEMFPackage.VEX_ATTRIBUTE__NAMESPACE_PREFIX:
+				return getNamespacePrefix();
+			case DomEMFPackage.VEX_ATTRIBUTE__NAMESPACE_URI:
+				return getNamespaceURI();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_ATTRIBUTE__DOCUMENT:
+				setDocument((VEXDocument)newValue);
+				return;
+			case DomEMFPackage.VEX_ATTRIBUTE__VALUE:
+				setValue((String)newValue);
+				return;
+			case DomEMFPackage.VEX_ATTRIBUTE__PARENT:
+				setParent((VEXElement)newValue);
+				return;
+			case DomEMFPackage.VEX_ATTRIBUTE__LOCAL_NAME:
+				setLocalName((String)newValue);
+				return;
+			case DomEMFPackage.VEX_ATTRIBUTE__NAMESPACE_PREFIX:
+				setNamespacePrefix((String)newValue);
+				return;
+			case DomEMFPackage.VEX_ATTRIBUTE__NAMESPACE_URI:
+				setNamespaceURI((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_ATTRIBUTE__DOCUMENT:
+				setDocument((VEXDocument)null);
+				return;
+			case DomEMFPackage.VEX_ATTRIBUTE__VALUE:
+				setValue(VALUE_EDEFAULT);
+				return;
+			case DomEMFPackage.VEX_ATTRIBUTE__PARENT:
+				setParent((VEXElement)null);
+				return;
+			case DomEMFPackage.VEX_ATTRIBUTE__LOCAL_NAME:
+				setLocalName(LOCAL_NAME_EDEFAULT);
+				return;
+			case DomEMFPackage.VEX_ATTRIBUTE__NAMESPACE_PREFIX:
+				setNamespacePrefix(NAMESPACE_PREFIX_EDEFAULT);
+				return;
+			case DomEMFPackage.VEX_ATTRIBUTE__NAMESPACE_URI:
+				setNamespaceURI(NAMESPACE_URI_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_ATTRIBUTE__DOCUMENT:
+				return document != null;
+			case DomEMFPackage.VEX_ATTRIBUTE__VALUE:
+				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
+			case DomEMFPackage.VEX_ATTRIBUTE__PARENT:
+				return parent != null;
+			case DomEMFPackage.VEX_ATTRIBUTE__LOCAL_NAME:
+				return LOCAL_NAME_EDEFAULT == null ? localName != null : !LOCAL_NAME_EDEFAULT.equals(localName);
+			case DomEMFPackage.VEX_ATTRIBUTE__NAMESPACE_PREFIX:
+				return NAMESPACE_PREFIX_EDEFAULT == null ? namespacePrefix != null : !NAMESPACE_PREFIX_EDEFAULT.equals(namespacePrefix);
+			case DomEMFPackage.VEX_ATTRIBUTE__NAMESPACE_URI:
+				return NAMESPACE_URI_EDEFAULT == null ? namespaceURI != null : !NAMESPACE_URI_EDEFAULT.equals(namespaceURI);
+		}
+		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(" (value: ");
+		result.append(value);
+		result.append(", localName: ");
+		result.append(localName);
+		result.append(", namespacePrefix: ");
+		result.append(namespacePrefix);
+		result.append(", namespaceURI: ");
+		result.append(namespaceURI);
+		result.append(')');
+		return result.toString();
+	}
+
+} //VEXAttributeImpl
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/VEXCommentImpl.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/VEXCommentImpl.java
new file mode 100644
index 0000000..54fca6b
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/VEXCommentImpl.java
@@ -0,0 +1,171 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXComment;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>VEX Comment</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXCommentImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class VEXCommentImpl extends VEXNodeImpl implements VEXComment {
+	/**
+	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String VALUE_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected String value = VALUE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected VEXCommentImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DomEMFPackage.Literals.VEX_COMMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(String newValue) {
+		String oldValue = value;
+		value = newValue;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_COMMENT__VALUE, oldValue, value));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_COMMENT__VALUE:
+				return getValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_COMMENT__VALUE:
+				setValue((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_COMMENT__VALUE:
+				setValue(VALUE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_COMMENT__VALUE:
+				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
+		}
+		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(" (value: ");
+		result.append(value);
+		result.append(')');
+		return result.toString();
+	}
+
+} //VEXCommentImpl
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/VEXDocumentFragmentImpl.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/VEXDocumentFragmentImpl.java
new file mode 100644
index 0000000..2b14c47
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/VEXDocumentFragmentImpl.java
@@ -0,0 +1,348 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+
+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.EDataTypeUniqueEList;
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>VEX Document Fragment</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXDocumentFragmentImpl#getContent <em>Content</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXDocumentFragmentImpl#getLength <em>Length</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXDocumentFragmentImpl#getElements <em>Elements</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXDocumentFragmentImpl#getNodeNames <em>Node Names</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXDocumentFragmentImpl#getNodes <em>Nodes</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class VEXDocumentFragmentImpl extends EObjectImpl implements VEXDocumentFragment {
+	/**
+	 * The cached value of the '{@link #getContent() <em>Content</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getContent()
+	 * @generated
+	 * @ordered
+	 */
+	protected Content content;
+
+	/**
+	 * The default value of the '{@link #getLength() <em>Length</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLength()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int LENGTH_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getLength() <em>Length</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLength()
+	 * @generated
+	 * @ordered
+	 */
+	protected int length = LENGTH_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getElements() <em>Elements</em>}' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getElements()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<VEXElement> elements;
+
+	/**
+	 * The cached value of the '{@link #getNodeNames() <em>Node Names</em>}' attribute list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getNodeNames()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<String> nodeNames;
+
+	/**
+	 * The cached value of the '{@link #getNodes() <em>Nodes</em>}' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getNodes()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<VEXNode> nodes;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected VEXDocumentFragmentImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DomEMFPackage.Literals.VEX_DOCUMENT_FRAGMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Content getContent() {
+		if (content != null && content.eIsProxy()) {
+			InternalEObject oldContent = (InternalEObject)content;
+			content = (Content)eResolveProxy(oldContent);
+			if (content != oldContent) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, DomEMFPackage.VEX_DOCUMENT_FRAGMENT__CONTENT, oldContent, content));
+			}
+		}
+		return content;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Content basicGetContent() {
+		return content;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setContent(Content newContent) {
+		Content oldContent = content;
+		content = newContent;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_DOCUMENT_FRAGMENT__CONTENT, oldContent, content));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getLength() {
+		return length;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setLength(int newLength) {
+		int oldLength = length;
+		length = newLength;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_DOCUMENT_FRAGMENT__LENGTH, oldLength, length));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<VEXElement> getElements() {
+		if (elements == null) {
+			elements = new EObjectResolvingEList<VEXElement>(VEXElement.class, this, DomEMFPackage.VEX_DOCUMENT_FRAGMENT__ELEMENTS);
+		}
+		return elements;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<String> getNodeNames() {
+		if (nodeNames == null) {
+			nodeNames = new EDataTypeUniqueEList<String>(String.class, this, DomEMFPackage.VEX_DOCUMENT_FRAGMENT__NODE_NAMES);
+		}
+		return nodeNames;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<VEXNode> getNodes() {
+		if (nodes == null) {
+			nodes = new EObjectResolvingEList<VEXNode>(VEXNode.class, this, DomEMFPackage.VEX_DOCUMENT_FRAGMENT__NODES);
+		}
+		return nodes;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_DOCUMENT_FRAGMENT__CONTENT:
+				if (resolve) return getContent();
+				return basicGetContent();
+			case DomEMFPackage.VEX_DOCUMENT_FRAGMENT__LENGTH:
+				return new Integer(getLength());
+			case DomEMFPackage.VEX_DOCUMENT_FRAGMENT__ELEMENTS:
+				return getElements();
+			case DomEMFPackage.VEX_DOCUMENT_FRAGMENT__NODE_NAMES:
+				return getNodeNames();
+			case DomEMFPackage.VEX_DOCUMENT_FRAGMENT__NODES:
+				return getNodes();
+		}
+		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 DomEMFPackage.VEX_DOCUMENT_FRAGMENT__CONTENT:
+				setContent((Content)newValue);
+				return;
+			case DomEMFPackage.VEX_DOCUMENT_FRAGMENT__LENGTH:
+				setLength(((Integer)newValue).intValue());
+				return;
+			case DomEMFPackage.VEX_DOCUMENT_FRAGMENT__ELEMENTS:
+				getElements().clear();
+				getElements().addAll((Collection<? extends VEXElement>)newValue);
+				return;
+			case DomEMFPackage.VEX_DOCUMENT_FRAGMENT__NODE_NAMES:
+				getNodeNames().clear();
+				getNodeNames().addAll((Collection<? extends String>)newValue);
+				return;
+			case DomEMFPackage.VEX_DOCUMENT_FRAGMENT__NODES:
+				getNodes().clear();
+				getNodes().addAll((Collection<? extends VEXNode>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_DOCUMENT_FRAGMENT__CONTENT:
+				setContent((Content)null);
+				return;
+			case DomEMFPackage.VEX_DOCUMENT_FRAGMENT__LENGTH:
+				setLength(LENGTH_EDEFAULT);
+				return;
+			case DomEMFPackage.VEX_DOCUMENT_FRAGMENT__ELEMENTS:
+				getElements().clear();
+				return;
+			case DomEMFPackage.VEX_DOCUMENT_FRAGMENT__NODE_NAMES:
+				getNodeNames().clear();
+				return;
+			case DomEMFPackage.VEX_DOCUMENT_FRAGMENT__NODES:
+				getNodes().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_DOCUMENT_FRAGMENT__CONTENT:
+				return content != null;
+			case DomEMFPackage.VEX_DOCUMENT_FRAGMENT__LENGTH:
+				return length != LENGTH_EDEFAULT;
+			case DomEMFPackage.VEX_DOCUMENT_FRAGMENT__ELEMENTS:
+				return elements != null && !elements.isEmpty();
+			case DomEMFPackage.VEX_DOCUMENT_FRAGMENT__NODE_NAMES:
+				return nodeNames != null && !nodeNames.isEmpty();
+			case DomEMFPackage.VEX_DOCUMENT_FRAGMENT__NODES:
+				return nodes != null && !nodes.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(" (length: ");
+		result.append(length);
+		result.append(", nodeNames: ");
+		result.append(nodeNames);
+		result.append(')');
+		return result.toString();
+	}
+
+} //VEXDocumentFragmentImpl
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/VEXDocumentImpl.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/VEXDocumentImpl.java
new file mode 100644
index 0000000..37485bf
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/VEXDocumentImpl.java
@@ -0,0 +1,575 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+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.wst.xml.vex.core.internal.dom.DocumentValidationException;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Position;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>VEX Document</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXDocumentImpl#getEncoding <em>Encoding</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXDocumentImpl#getLength <em>Length</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXDocumentImpl#getRootElement <em>Root Element</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXDocumentImpl#getValidator <em>Validator</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXDocumentImpl#getPublicID <em>Public ID</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class VEXDocumentImpl extends EObjectImpl implements VEXDocument {
+	/**
+	 * The default value of the '{@link #getEncoding() <em>Encoding</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEncoding()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String ENCODING_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getEncoding() <em>Encoding</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEncoding()
+	 * @generated
+	 * @ordered
+	 */
+	protected String encoding = ENCODING_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getLength() <em>Length</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLength()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int LENGTH_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getLength() <em>Length</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLength()
+	 * @generated
+	 * @ordered
+	 */
+	protected int length = LENGTH_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getRootElement() <em>Root Element</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRootElement()
+	 * @generated
+	 * @ordered
+	 */
+	protected VEXElement rootElement;
+
+	/**
+	 * The cached value of the '{@link #getValidator() <em>Validator</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValidator()
+	 * @generated
+	 * @ordered
+	 */
+	protected Validator validator;
+
+	/**
+	 * The default value of the '{@link #getPublicID() <em>Public ID</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPublicID()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String PUBLIC_ID_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getPublicID() <em>Public ID</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPublicID()
+	 * @generated
+	 * @ordered
+	 */
+	protected String publicID = PUBLIC_ID_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected VEXDocumentImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DomEMFPackage.Literals.VEX_DOCUMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getEncoding() {
+		return encoding;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setEncoding(String newEncoding) {
+		String oldEncoding = encoding;
+		encoding = newEncoding;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_DOCUMENT__ENCODING, oldEncoding, encoding));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getLength() {
+		return length;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setLength(int newLength) {
+		int oldLength = length;
+		length = newLength;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_DOCUMENT__LENGTH, oldLength, length));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXElement getRootElement() {
+		if (rootElement != null && rootElement.eIsProxy()) {
+			InternalEObject oldRootElement = (InternalEObject)rootElement;
+			rootElement = (VEXElement)eResolveProxy(oldRootElement);
+			if (rootElement != oldRootElement) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, DomEMFPackage.VEX_DOCUMENT__ROOT_ELEMENT, oldRootElement, rootElement));
+			}
+		}
+		return rootElement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXElement basicGetRootElement() {
+		return rootElement;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setRootElement(VEXElement newRootElement) {
+		VEXElement oldRootElement = rootElement;
+		rootElement = newRootElement;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_DOCUMENT__ROOT_ELEMENT, oldRootElement, rootElement));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Validator getValidator() {
+		if (validator != null && validator.eIsProxy()) {
+			InternalEObject oldValidator = (InternalEObject)validator;
+			validator = (Validator)eResolveProxy(oldValidator);
+			if (validator != oldValidator) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, DomEMFPackage.VEX_DOCUMENT__VALIDATOR, oldValidator, validator));
+			}
+		}
+		return validator;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Validator basicGetValidator() {
+		return validator;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValidator(Validator newValidator) {
+		Validator oldValidator = validator;
+		validator = newValidator;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_DOCUMENT__VALIDATOR, oldValidator, validator));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getPublicID() {
+		return publicID;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setPublicID(String newPublicID) {
+		String oldPublicID = publicID;
+		publicID = newPublicID;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_DOCUMENT__PUBLIC_ID, oldPublicID, publicID));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean canInsertFragment(int offset, VEXDocumentFragment fragment) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean canInsertText(int offset) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Position createPosition(int offset) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void delete(int startOffset, int endOffset) throws DocumentValidationException {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXElement findCommonElement(int offset1, int offset2) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public char getCharacterAt(int offset) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXElement getElementAt(int offset) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXDocumentFragment getFragment(int startOffset, int endOffset) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<String> getNodeNames(int startOffset, int endOffset) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<VEXNode> getNodes(int startOffset, int endOffset) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getRawText(int startOffset, int endOffset) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getText(int startOffset, int endOffset) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void insertElement(int offset, VEXElement defaults) throws DocumentValidationException {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void insertFragment(int offset, VEXDocumentFragment fragment) throws DocumentValidationException {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void insertText(int offset, String text) throws DocumentValidationException {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_DOCUMENT__ENCODING:
+				return getEncoding();
+			case DomEMFPackage.VEX_DOCUMENT__LENGTH:
+				return new Integer(getLength());
+			case DomEMFPackage.VEX_DOCUMENT__ROOT_ELEMENT:
+				if (resolve) return getRootElement();
+				return basicGetRootElement();
+			case DomEMFPackage.VEX_DOCUMENT__VALIDATOR:
+				if (resolve) return getValidator();
+				return basicGetValidator();
+			case DomEMFPackage.VEX_DOCUMENT__PUBLIC_ID:
+				return getPublicID();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_DOCUMENT__ENCODING:
+				setEncoding((String)newValue);
+				return;
+			case DomEMFPackage.VEX_DOCUMENT__LENGTH:
+				setLength(((Integer)newValue).intValue());
+				return;
+			case DomEMFPackage.VEX_DOCUMENT__ROOT_ELEMENT:
+				setRootElement((VEXElement)newValue);
+				return;
+			case DomEMFPackage.VEX_DOCUMENT__VALIDATOR:
+				setValidator((Validator)newValue);
+				return;
+			case DomEMFPackage.VEX_DOCUMENT__PUBLIC_ID:
+				setPublicID((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_DOCUMENT__ENCODING:
+				setEncoding(ENCODING_EDEFAULT);
+				return;
+			case DomEMFPackage.VEX_DOCUMENT__LENGTH:
+				setLength(LENGTH_EDEFAULT);
+				return;
+			case DomEMFPackage.VEX_DOCUMENT__ROOT_ELEMENT:
+				setRootElement((VEXElement)null);
+				return;
+			case DomEMFPackage.VEX_DOCUMENT__VALIDATOR:
+				setValidator((Validator)null);
+				return;
+			case DomEMFPackage.VEX_DOCUMENT__PUBLIC_ID:
+				setPublicID(PUBLIC_ID_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_DOCUMENT__ENCODING:
+				return ENCODING_EDEFAULT == null ? encoding != null : !ENCODING_EDEFAULT.equals(encoding);
+			case DomEMFPackage.VEX_DOCUMENT__LENGTH:
+				return length != LENGTH_EDEFAULT;
+			case DomEMFPackage.VEX_DOCUMENT__ROOT_ELEMENT:
+				return rootElement != null;
+			case DomEMFPackage.VEX_DOCUMENT__VALIDATOR:
+				return validator != null;
+			case DomEMFPackage.VEX_DOCUMENT__PUBLIC_ID:
+				return PUBLIC_ID_EDEFAULT == null ? publicID != null : !PUBLIC_ID_EDEFAULT.equals(publicID);
+		}
+		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(" (encoding: ");
+		result.append(encoding);
+		result.append(", length: ");
+		result.append(length);
+		result.append(", publicID: ");
+		result.append(publicID);
+		result.append(')');
+		return result.toString();
+	}
+
+} //VEXDocumentImpl
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/VEXElementImpl.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/VEXElementImpl.java
new file mode 100644
index 0000000..6e78da4
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/VEXElementImpl.java
@@ -0,0 +1,659 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+
+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.util.EDataTypeUniqueEList;
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+
+import org.eclipse.wst.xml.vex.core.internal.dom.DocumentValidationException;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>VEX Element</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXElementImpl#getAttributeNames <em>Attribute Names</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXElementImpl#getChildElements <em>Child Elements</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXElementImpl#getChildNodes <em>Child Nodes</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXElementImpl#getDocument <em>Document</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXElementImpl#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXElementImpl#isEmpty <em>Empty</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXElementImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXElementImpl#getNamespacePrefix <em>Namespace Prefix</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXElementImpl#getNamespaceURI <em>Namespace URI</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class VEXElementImpl extends VEXNodeImpl implements VEXElement {
+	/**
+	 * The cached value of the '{@link #getAttributeNames() <em>Attribute Names</em>}' attribute list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAttributeNames()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<String> attributeNames;
+
+	/**
+	 * The cached value of the '{@link #getChildElements() <em>Child Elements</em>}' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getChildElements()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<VEXElement> childElements;
+
+	/**
+	 * The cached value of the '{@link #getChildNodes() <em>Child Nodes</em>}' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getChildNodes()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<VEXNode> childNodes;
+
+	/**
+	 * The cached value of the '{@link #getDocument() <em>Document</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDocument()
+	 * @generated
+	 * @ordered
+	 */
+	protected VEXDocument document;
+
+	/**
+	 * 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 #isEmpty() <em>Empty</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isEmpty()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean EMPTY_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isEmpty() <em>Empty</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isEmpty()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean empty = EMPTY_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getParent()
+	 * @generated
+	 * @ordered
+	 */
+	protected VEXElement parent;
+
+	/**
+	 * The default value of the '{@link #getNamespacePrefix() <em>Namespace Prefix</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getNamespacePrefix()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String NAMESPACE_PREFIX_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getNamespacePrefix() <em>Namespace Prefix</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getNamespacePrefix()
+	 * @generated
+	 * @ordered
+	 */
+	protected String namespacePrefix = NAMESPACE_PREFIX_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getNamespaceURI() <em>Namespace URI</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getNamespaceURI()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String NAMESPACE_URI_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getNamespaceURI() <em>Namespace URI</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getNamespaceURI()
+	 * @generated
+	 * @ordered
+	 */
+	protected String namespaceURI = NAMESPACE_URI_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected VEXElementImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DomEMFPackage.Literals.VEX_ELEMENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<String> getAttributeNames() {
+		if (attributeNames == null) {
+			attributeNames = new EDataTypeUniqueEList<String>(String.class, this, DomEMFPackage.VEX_ELEMENT__ATTRIBUTE_NAMES);
+		}
+		return attributeNames;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<VEXElement> getChildElements() {
+		if (childElements == null) {
+			childElements = new EObjectResolvingEList<VEXElement>(VEXElement.class, this, DomEMFPackage.VEX_ELEMENT__CHILD_ELEMENTS);
+		}
+		return childElements;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<VEXNode> getChildNodes() {
+		if (childNodes == null) {
+			childNodes = new EObjectResolvingEList<VEXNode>(VEXNode.class, this, DomEMFPackage.VEX_ELEMENT__CHILD_NODES);
+		}
+		return childNodes;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXDocument getDocument() {
+		if (document != null && document.eIsProxy()) {
+			InternalEObject oldDocument = (InternalEObject)document;
+			document = (VEXDocument)eResolveProxy(oldDocument);
+			if (document != oldDocument) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, DomEMFPackage.VEX_ELEMENT__DOCUMENT, oldDocument, document));
+			}
+		}
+		return document;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXDocument basicGetDocument() {
+		return document;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDocument(VEXDocument newDocument) {
+		VEXDocument oldDocument = document;
+		document = newDocument;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_ELEMENT__DOCUMENT, oldDocument, document));
+	}
+
+	/**
+	 * <!-- 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, DomEMFPackage.VEX_ELEMENT__NAME, oldName, name));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isEmpty() {
+		return empty;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setEmpty(boolean newEmpty) {
+		boolean oldEmpty = empty;
+		empty = newEmpty;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_ELEMENT__EMPTY, oldEmpty, empty));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXElement getParent() {
+		if (parent != null && parent.eIsProxy()) {
+			InternalEObject oldParent = (InternalEObject)parent;
+			parent = (VEXElement)eResolveProxy(oldParent);
+			if (parent != oldParent) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, DomEMFPackage.VEX_ELEMENT__PARENT, oldParent, parent));
+			}
+		}
+		return parent;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXElement basicGetParent() {
+		return parent;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setParent(VEXElement newParent) {
+		VEXElement oldParent = parent;
+		parent = newParent;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_ELEMENT__PARENT, oldParent, parent));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getNamespacePrefix() {
+		return namespacePrefix;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setNamespacePrefix(String newNamespacePrefix) {
+		String oldNamespacePrefix = namespacePrefix;
+		namespacePrefix = newNamespacePrefix;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_ELEMENT__NAMESPACE_PREFIX, oldNamespacePrefix, namespacePrefix));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getNamespaceURI() {
+		return namespaceURI;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setNamespaceURI(String newNamespaceURI) {
+		String oldNamespaceURI = namespaceURI;
+		namespaceURI = newNamespaceURI;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_ELEMENT__NAMESPACE_URI, oldNamespaceURI, namespaceURI));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void addChild(VEXElement child) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Object clone() {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getAttribute(String name) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void removeAttribute(String name) throws DocumentValidationException {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAttribute(String name, String value) throws DocumentValidationException {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setContent(Content content, int offset, int i) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void insertChild(int index, VEXElement child) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setNamespace(String prefix, String namespaceURI) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_ELEMENT__ATTRIBUTE_NAMES:
+				return getAttributeNames();
+			case DomEMFPackage.VEX_ELEMENT__CHILD_ELEMENTS:
+				return getChildElements();
+			case DomEMFPackage.VEX_ELEMENT__CHILD_NODES:
+				return getChildNodes();
+			case DomEMFPackage.VEX_ELEMENT__DOCUMENT:
+				if (resolve) return getDocument();
+				return basicGetDocument();
+			case DomEMFPackage.VEX_ELEMENT__NAME:
+				return getName();
+			case DomEMFPackage.VEX_ELEMENT__EMPTY:
+				return isEmpty() ? Boolean.TRUE : Boolean.FALSE;
+			case DomEMFPackage.VEX_ELEMENT__PARENT:
+				if (resolve) return getParent();
+				return basicGetParent();
+			case DomEMFPackage.VEX_ELEMENT__NAMESPACE_PREFIX:
+				return getNamespacePrefix();
+			case DomEMFPackage.VEX_ELEMENT__NAMESPACE_URI:
+				return getNamespaceURI();
+		}
+		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 DomEMFPackage.VEX_ELEMENT__ATTRIBUTE_NAMES:
+				getAttributeNames().clear();
+				getAttributeNames().addAll((Collection<? extends String>)newValue);
+				return;
+			case DomEMFPackage.VEX_ELEMENT__CHILD_ELEMENTS:
+				getChildElements().clear();
+				getChildElements().addAll((Collection<? extends VEXElement>)newValue);
+				return;
+			case DomEMFPackage.VEX_ELEMENT__CHILD_NODES:
+				getChildNodes().clear();
+				getChildNodes().addAll((Collection<? extends VEXNode>)newValue);
+				return;
+			case DomEMFPackage.VEX_ELEMENT__DOCUMENT:
+				setDocument((VEXDocument)newValue);
+				return;
+			case DomEMFPackage.VEX_ELEMENT__NAME:
+				setName((String)newValue);
+				return;
+			case DomEMFPackage.VEX_ELEMENT__EMPTY:
+				setEmpty(((Boolean)newValue).booleanValue());
+				return;
+			case DomEMFPackage.VEX_ELEMENT__PARENT:
+				setParent((VEXElement)newValue);
+				return;
+			case DomEMFPackage.VEX_ELEMENT__NAMESPACE_PREFIX:
+				setNamespacePrefix((String)newValue);
+				return;
+			case DomEMFPackage.VEX_ELEMENT__NAMESPACE_URI:
+				setNamespaceURI((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_ELEMENT__ATTRIBUTE_NAMES:
+				getAttributeNames().clear();
+				return;
+			case DomEMFPackage.VEX_ELEMENT__CHILD_ELEMENTS:
+				getChildElements().clear();
+				return;
+			case DomEMFPackage.VEX_ELEMENT__CHILD_NODES:
+				getChildNodes().clear();
+				return;
+			case DomEMFPackage.VEX_ELEMENT__DOCUMENT:
+				setDocument((VEXDocument)null);
+				return;
+			case DomEMFPackage.VEX_ELEMENT__NAME:
+				setName(NAME_EDEFAULT);
+				return;
+			case DomEMFPackage.VEX_ELEMENT__EMPTY:
+				setEmpty(EMPTY_EDEFAULT);
+				return;
+			case DomEMFPackage.VEX_ELEMENT__PARENT:
+				setParent((VEXElement)null);
+				return;
+			case DomEMFPackage.VEX_ELEMENT__NAMESPACE_PREFIX:
+				setNamespacePrefix(NAMESPACE_PREFIX_EDEFAULT);
+				return;
+			case DomEMFPackage.VEX_ELEMENT__NAMESPACE_URI:
+				setNamespaceURI(NAMESPACE_URI_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_ELEMENT__ATTRIBUTE_NAMES:
+				return attributeNames != null && !attributeNames.isEmpty();
+			case DomEMFPackage.VEX_ELEMENT__CHILD_ELEMENTS:
+				return childElements != null && !childElements.isEmpty();
+			case DomEMFPackage.VEX_ELEMENT__CHILD_NODES:
+				return childNodes != null && !childNodes.isEmpty();
+			case DomEMFPackage.VEX_ELEMENT__DOCUMENT:
+				return document != null;
+			case DomEMFPackage.VEX_ELEMENT__NAME:
+				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+			case DomEMFPackage.VEX_ELEMENT__EMPTY:
+				return empty != EMPTY_EDEFAULT;
+			case DomEMFPackage.VEX_ELEMENT__PARENT:
+				return parent != null;
+			case DomEMFPackage.VEX_ELEMENT__NAMESPACE_PREFIX:
+				return NAMESPACE_PREFIX_EDEFAULT == null ? namespacePrefix != null : !NAMESPACE_PREFIX_EDEFAULT.equals(namespacePrefix);
+			case DomEMFPackage.VEX_ELEMENT__NAMESPACE_URI:
+				return NAMESPACE_URI_EDEFAULT == null ? namespaceURI != null : !NAMESPACE_URI_EDEFAULT.equals(namespaceURI);
+		}
+		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(" (attributeNames: ");
+		result.append(attributeNames);
+		result.append(", name: ");
+		result.append(name);
+		result.append(", empty: ");
+		result.append(empty);
+		result.append(", namespacePrefix: ");
+		result.append(namespacePrefix);
+		result.append(", namespaceURI: ");
+		result.append(namespaceURI);
+		result.append(')');
+		return result.toString();
+	}
+
+} //VEXElementImpl
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/VEXNodeImpl.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/VEXNodeImpl.java
new file mode 100644
index 0000000..abdc948
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/VEXNodeImpl.java
@@ -0,0 +1,463 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+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.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Position;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>VEX Node</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXNodeImpl#getContent <em>Content</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXNodeImpl#getEndOffset <em>End Offset</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXNodeImpl#getEndPosition <em>End Position</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXNodeImpl#getStartOffset <em>Start Offset</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXNodeImpl#getStartPosition <em>Start Position</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXNodeImpl#getText <em>Text</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class VEXNodeImpl extends EObjectImpl implements VEXNode {
+	/**
+	 * The cached value of the '{@link #getContent() <em>Content</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getContent()
+	 * @generated
+	 * @ordered
+	 */
+	protected Content content;
+
+	/**
+	 * The default value of the '{@link #getEndOffset() <em>End Offset</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEndOffset()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int END_OFFSET_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getEndOffset() <em>End Offset</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEndOffset()
+	 * @generated
+	 * @ordered
+	 */
+	protected int endOffset = END_OFFSET_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getEndPosition() <em>End Position</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEndPosition()
+	 * @generated
+	 * @ordered
+	 */
+	protected Position endPosition;
+
+	/**
+	 * The default value of the '{@link #getStartOffset() <em>Start Offset</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getStartOffset()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int START_OFFSET_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getStartOffset() <em>Start Offset</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getStartOffset()
+	 * @generated
+	 * @ordered
+	 */
+	protected int startOffset = START_OFFSET_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getStartPosition() <em>Start Position</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getStartPosition()
+	 * @generated
+	 * @ordered
+	 */
+	protected Position startPosition;
+
+	/**
+	 * The default value of the '{@link #getText() <em>Text</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getText()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String TEXT_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getText() <em>Text</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getText()
+	 * @generated
+	 * @ordered
+	 */
+	protected String text = TEXT_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected VEXNodeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DomEMFPackage.Literals.VEX_NODE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Content getContent() {
+		if (content != null && content.eIsProxy()) {
+			InternalEObject oldContent = (InternalEObject)content;
+			content = (Content)eResolveProxy(oldContent);
+			if (content != oldContent) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, DomEMFPackage.VEX_NODE__CONTENT, oldContent, content));
+			}
+		}
+		return content;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Content basicGetContent() {
+		return content;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setContent(Content newContent) {
+		Content oldContent = content;
+		content = newContent;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_NODE__CONTENT, oldContent, content));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getEndOffset() {
+		return endOffset;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setEndOffset(int newEndOffset) {
+		int oldEndOffset = endOffset;
+		endOffset = newEndOffset;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_NODE__END_OFFSET, oldEndOffset, endOffset));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Position getEndPosition() {
+		if (endPosition != null && endPosition.eIsProxy()) {
+			InternalEObject oldEndPosition = (InternalEObject)endPosition;
+			endPosition = (Position)eResolveProxy(oldEndPosition);
+			if (endPosition != oldEndPosition) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, DomEMFPackage.VEX_NODE__END_POSITION, oldEndPosition, endPosition));
+			}
+		}
+		return endPosition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Position basicGetEndPosition() {
+		return endPosition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setEndPosition(Position newEndPosition) {
+		Position oldEndPosition = endPosition;
+		endPosition = newEndPosition;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_NODE__END_POSITION, oldEndPosition, endPosition));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getStartOffset() {
+		return startOffset;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setStartOffset(int newStartOffset) {
+		int oldStartOffset = startOffset;
+		startOffset = newStartOffset;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_NODE__START_OFFSET, oldStartOffset, startOffset));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Position getStartPosition() {
+		if (startPosition != null && startPosition.eIsProxy()) {
+			InternalEObject oldStartPosition = (InternalEObject)startPosition;
+			startPosition = (Position)eResolveProxy(oldStartPosition);
+			if (startPosition != oldStartPosition) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, DomEMFPackage.VEX_NODE__START_POSITION, oldStartPosition, startPosition));
+			}
+		}
+		return startPosition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Position basicGetStartPosition() {
+		return startPosition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setStartPosition(Position newStartPosition) {
+		Position oldStartPosition = startPosition;
+		startPosition = newStartPosition;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_NODE__START_POSITION, oldStartPosition, startPosition));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getText() {
+		return text;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setText(String newText) {
+		String oldText = text;
+		text = newText;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VEX_NODE__TEXT, oldText, text));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_NODE__CONTENT:
+				if (resolve) return getContent();
+				return basicGetContent();
+			case DomEMFPackage.VEX_NODE__END_OFFSET:
+				return new Integer(getEndOffset());
+			case DomEMFPackage.VEX_NODE__END_POSITION:
+				if (resolve) return getEndPosition();
+				return basicGetEndPosition();
+			case DomEMFPackage.VEX_NODE__START_OFFSET:
+				return new Integer(getStartOffset());
+			case DomEMFPackage.VEX_NODE__START_POSITION:
+				if (resolve) return getStartPosition();
+				return basicGetStartPosition();
+			case DomEMFPackage.VEX_NODE__TEXT:
+				return getText();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_NODE__CONTENT:
+				setContent((Content)newValue);
+				return;
+			case DomEMFPackage.VEX_NODE__END_OFFSET:
+				setEndOffset(((Integer)newValue).intValue());
+				return;
+			case DomEMFPackage.VEX_NODE__END_POSITION:
+				setEndPosition((Position)newValue);
+				return;
+			case DomEMFPackage.VEX_NODE__START_OFFSET:
+				setStartOffset(((Integer)newValue).intValue());
+				return;
+			case DomEMFPackage.VEX_NODE__START_POSITION:
+				setStartPosition((Position)newValue);
+				return;
+			case DomEMFPackage.VEX_NODE__TEXT:
+				setText((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_NODE__CONTENT:
+				setContent((Content)null);
+				return;
+			case DomEMFPackage.VEX_NODE__END_OFFSET:
+				setEndOffset(END_OFFSET_EDEFAULT);
+				return;
+			case DomEMFPackage.VEX_NODE__END_POSITION:
+				setEndPosition((Position)null);
+				return;
+			case DomEMFPackage.VEX_NODE__START_OFFSET:
+				setStartOffset(START_OFFSET_EDEFAULT);
+				return;
+			case DomEMFPackage.VEX_NODE__START_POSITION:
+				setStartPosition((Position)null);
+				return;
+			case DomEMFPackage.VEX_NODE__TEXT:
+				setText(TEXT_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_NODE__CONTENT:
+				return content != null;
+			case DomEMFPackage.VEX_NODE__END_OFFSET:
+				return endOffset != END_OFFSET_EDEFAULT;
+			case DomEMFPackage.VEX_NODE__END_POSITION:
+				return endPosition != null;
+			case DomEMFPackage.VEX_NODE__START_OFFSET:
+				return startOffset != START_OFFSET_EDEFAULT;
+			case DomEMFPackage.VEX_NODE__START_POSITION:
+				return startPosition != null;
+			case DomEMFPackage.VEX_NODE__TEXT:
+				return TEXT_EDEFAULT == null ? text != null : !TEXT_EDEFAULT.equals(text);
+		}
+		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(" (endOffset: ");
+		result.append(endOffset);
+		result.append(", startOffset: ");
+		result.append(startOffset);
+		result.append(", text: ");
+		result.append(text);
+		result.append(')');
+		return result.toString();
+	}
+
+} //VEXNodeImpl
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/VEXProcessingInstructionImpl.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/VEXProcessingInstructionImpl.java
new file mode 100644
index 0000000..63ea703
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/VEXProcessingInstructionImpl.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXProcessingInstruction;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>VEX Processing Instruction</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.VEXProcessingInstructionImpl#getAttributes <em>Attributes</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class VEXProcessingInstructionImpl extends VEXNodeImpl implements VEXProcessingInstruction {
+	/**
+	 * The cached value of the '{@link #getAttributes() <em>Attributes</em>}' reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAttributes()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<VEXAttribute> attributes;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected VEXProcessingInstructionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DomEMFPackage.Literals.VEX_PROCESSING_INSTRUCTION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<VEXAttribute> getAttributes() {
+		if (attributes == null) {
+			attributes = new EObjectResolvingEList<VEXAttribute>(VEXAttribute.class, this, DomEMFPackage.VEX_PROCESSING_INSTRUCTION__ATTRIBUTES);
+		}
+		return attributes;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean removeAttribute(String attributeName) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAttribute(String attributeName, String value) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_PROCESSING_INSTRUCTION__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 DomEMFPackage.VEX_PROCESSING_INSTRUCTION__ATTRIBUTES:
+				getAttributes().clear();
+				getAttributes().addAll((Collection<? extends VEXAttribute>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_PROCESSING_INSTRUCTION__ATTRIBUTES:
+				getAttributes().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DomEMFPackage.VEX_PROCESSING_INSTRUCTION__ATTRIBUTES:
+				return attributes != null && !attributes.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //VEXProcessingInstructionImpl
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/ValidatorImpl.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/ValidatorImpl.java
new file mode 100644
index 0000000..2dad9ec
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/impl/ValidatorImpl.java
@@ -0,0 +1,223 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl;
+
+import java.util.Set;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EObjectImpl;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator;
+
+import org.eclipse.wst.xml.vex.core.internal.validator.AttributeDefinition;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Validator</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.impl.ValidatorImpl#getValidRootElements <em>Valid Root Elements</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ValidatorImpl extends EObjectImpl implements Validator {
+	/**
+	 * The cached value of the '{@link #getValidRootElements() <em>Valid Root Elements</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValidRootElements()
+	 * @generated
+	 * @ordered
+	 */
+	protected Set validRootElements;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ValidatorImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DomEMFPackage.Literals.VALIDATOR;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Set getValidRootElements() {
+		return validRootElements;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValidRootElements(Set newValidRootElements) {
+		Set oldValidRootElements = validRootElements;
+		validRootElements = newValidRootElements;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DomEMFPackage.VALIDATOR__VALID_ROOT_ELEMENTS, oldValidRootElements, validRootElements));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public AttributeDefinition getAttributeDefinition(String element, String attribute) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<AttributeDefinition> getAttributeDefinitions(String element) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Set<String> getValidItems(String element) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isValidSequence(String element, EList<String> nodes, boolean partial) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isValidSequence(String element, EList<String> seq1, EList<String> seq2, EList<String> seq3, boolean partial) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DomEMFPackage.VALIDATOR__VALID_ROOT_ELEMENTS:
+				return getValidRootElements();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DomEMFPackage.VALIDATOR__VALID_ROOT_ELEMENTS:
+				setValidRootElements((Set)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DomEMFPackage.VALIDATOR__VALID_ROOT_ELEMENTS:
+				setValidRootElements((Set)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DomEMFPackage.VALIDATOR__VALID_ROOT_ELEMENTS:
+				return validRootElements != null;
+		}
+		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(" (validRootElements: ");
+		result.append(validRootElements);
+		result.append(')');
+		return result.toString();
+	}
+
+} //ValidatorImpl
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/util/DomEMFAdapterFactory.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/util/DomEMFAdapterFactory.java
new file mode 100644
index 0000000..ce78fae
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/util/DomEMFAdapterFactory.java
@@ -0,0 +1,312 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.util;
+
+import java.io.Serializable;
+
+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.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.*;
+
+/**
+ * <!-- 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.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage
+ * @generated
+ */
+public class DomEMFAdapterFactory extends AdapterFactoryImpl {
+	/**
+	 * The cached model package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static DomEMFPackage modelPackage;
+
+	/**
+	 * Creates an instance of the adapter factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DomEMFAdapterFactory() {
+		if (modelPackage == null) {
+			modelPackage = DomEMFPackage.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 DomEMFSwitch<Adapter> modelSwitch =
+		new DomEMFSwitch<Adapter>() {
+			@Override
+			public Adapter caseContent(Content object) {
+				return createContentAdapter();
+			}
+			@Override
+			public Adapter casePosition(Position object) {
+				return createPositionAdapter();
+			}
+			@Override
+			public Adapter caseVEXAttribute(VEXAttribute object) {
+				return createVEXAttributeAdapter();
+			}
+			@Override
+			public Adapter caseVEXComment(VEXComment object) {
+				return createVEXCommentAdapter();
+			}
+			@Override
+			public Adapter caseVEXDocument(VEXDocument object) {
+				return createVEXDocumentAdapter();
+			}
+			@Override
+			public Adapter caseVEXDocumentFragment(VEXDocumentFragment object) {
+				return createVEXDocumentFragmentAdapter();
+			}
+			@Override
+			public Adapter caseVEXElement(VEXElement object) {
+				return createVEXElementAdapter();
+			}
+			@Override
+			public Adapter caseVEXNode(VEXNode object) {
+				return createVEXNodeAdapter();
+			}
+			@Override
+			public Adapter caseVEXProcessingInstruction(VEXProcessingInstruction object) {
+				return createVEXProcessingInstructionAdapter();
+			}
+			@Override
+			public Adapter caseValidator(Validator object) {
+				return createValidatorAdapter();
+			}
+			@Override
+			public Adapter caseSerializable(Serializable object) {
+				return createSerializableAdapter();
+			}
+			@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.wst.xml.vex.core.internal.provisional.dom.I.Content <em>Content</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.wst.xml.vex.core.internal.provisional.dom.I.Content
+	 * @generated
+	 */
+	public Adapter createContentAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Position <em>Position</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.wst.xml.vex.core.internal.provisional.dom.I.Position
+	 * @generated
+	 */
+	public Adapter createPositionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute <em>VEX Attribute</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.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute
+	 * @generated
+	 */
+	public Adapter createVEXAttributeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXComment <em>VEX Comment</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.wst.xml.vex.core.internal.provisional.dom.I.VEXComment
+	 * @generated
+	 */
+	public Adapter createVEXCommentAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument <em>VEX Document</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.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument
+	 * @generated
+	 */
+	public Adapter createVEXDocumentAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment <em>VEX Document Fragment</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.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment
+	 * @generated
+	 */
+	public Adapter createVEXDocumentFragmentAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement <em>VEX Element</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.wst.xml.vex.core.internal.provisional.dom.I.VEXElement
+	 * @generated
+	 */
+	public Adapter createVEXElementAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode <em>VEX Node</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.wst.xml.vex.core.internal.provisional.dom.I.VEXNode
+	 * @generated
+	 */
+	public Adapter createVEXNodeAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXProcessingInstruction <em>VEX Processing Instruction</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.wst.xml.vex.core.internal.provisional.dom.I.VEXProcessingInstruction
+	 * @generated
+	 */
+	public Adapter createVEXProcessingInstructionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator <em>Validator</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.wst.xml.vex.core.internal.provisional.dom.I.Validator
+	 * @generated
+	 */
+	public Adapter createValidatorAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link java.io.Serializable <em>Serializable</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 java.io.Serializable
+	 * @generated
+	 */
+	public Adapter createSerializableAdapter() {
+		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;
+	}
+
+} //DomEMFAdapterFactory
diff --git a/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/util/DomEMFSwitch.java b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/util/DomEMFSwitch.java
new file mode 100644
index 0000000..d0af1c4
--- /dev/null
+++ b/sourceediting/plugins/org.eclipse.wst.xml.vex.core/src-emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/util/DomEMFSwitch.java
@@ -0,0 +1,347 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.util;
+
+import java.io.Serializable;
+
+import java.util.List;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.*;
+
+/**
+ * <!-- 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.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage
+ * @generated
+ */
+public class DomEMFSwitch<T> {
+	/**
+	 * The cached model package
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static DomEMFPackage modelPackage;
+
+	/**
+	 * Creates an instance of the switch.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DomEMFSwitch() {
+		if (modelPackage == null) {
+			modelPackage = DomEMFPackage.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 -->
+	 * <!-- 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 -->
+	 * <!-- 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);
+		}
+		else {
+			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 -->
+	 * <!-- 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 DomEMFPackage.CONTENT: {
+				Content content = (Content)theEObject;
+				T result = caseContent(content);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DomEMFPackage.POSITION: {
+				Position position = (Position)theEObject;
+				T result = casePosition(position);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DomEMFPackage.VEX_ATTRIBUTE: {
+				VEXAttribute vexAttribute = (VEXAttribute)theEObject;
+				T result = caseVEXAttribute(vexAttribute);
+				if (result == null) result = caseVEXNode(vexAttribute);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DomEMFPackage.VEX_COMMENT: {
+				VEXComment vexComment = (VEXComment)theEObject;
+				T result = caseVEXComment(vexComment);
+				if (result == null) result = caseVEXNode(vexComment);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DomEMFPackage.VEX_DOCUMENT: {
+				VEXDocument vexDocument = (VEXDocument)theEObject;
+				T result = caseVEXDocument(vexDocument);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DomEMFPackage.VEX_DOCUMENT_FRAGMENT: {
+				VEXDocumentFragment vexDocumentFragment = (VEXDocumentFragment)theEObject;
+				T result = caseVEXDocumentFragment(vexDocumentFragment);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DomEMFPackage.VEX_ELEMENT: {
+				VEXElement vexElement = (VEXElement)theEObject;
+				T result = caseVEXElement(vexElement);
+				if (result == null) result = caseVEXNode(vexElement);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DomEMFPackage.VEX_NODE: {
+				VEXNode vexNode = (VEXNode)theEObject;
+				T result = caseVEXNode(vexNode);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DomEMFPackage.VEX_PROCESSING_INSTRUCTION: {
+				VEXProcessingInstruction vexProcessingInstruction = (VEXProcessingInstruction)theEObject;
+				T result = caseVEXProcessingInstruction(vexProcessingInstruction);
+				if (result == null) result = caseVEXNode(vexProcessingInstruction);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DomEMFPackage.VALIDATOR: {
+				Validator validator = (Validator)theEObject;
+				T result = caseValidator(validator);
+				if (result == null) result = caseSerializable(validator);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			default: return defaultCase(theEObject);
+		}
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Content</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>Content</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseContent(Content object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Position</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>Position</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T casePosition(Position object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>VEX Attribute</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>VEX Attribute</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseVEXAttribute(VEXAttribute object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>VEX Comment</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>VEX Comment</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseVEXComment(VEXComment object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>VEX Document</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>VEX Document</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseVEXDocument(VEXDocument object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>VEX Document Fragment</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>VEX Document Fragment</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseVEXDocumentFragment(VEXDocumentFragment object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>VEX Element</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>VEX Element</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseVEXElement(VEXElement object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>VEX Node</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>VEX Node</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseVEXNode(VEXNode object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>VEX Processing Instruction</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>VEX Processing Instruction</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseVEXProcessingInstruction(VEXProcessingInstruction object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Validator</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>Validator</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseValidator(Validator object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Serializable</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>Serializable</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseSerializable(Serializable 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;
+	}
+
+} //DomEMFSwitch
diff --git a/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/.classpath b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/.classpath
index 64c5e31..c135c9c 100644
--- a/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/.classpath
+++ b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/.classpath
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
+	<classpathentry kind="src" path="src_emf"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
 	<classpathentry kind="src" path="src"/>
diff --git a/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/META-INF/MANIFEST.MF b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/META-INF/MANIFEST.MF
index 5d73c1a..67a5ec1 100644
--- a/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/META-INF/MANIFEST.MF
+++ b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/META-INF/MANIFEST.MF
@@ -1,20 +1,23 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
-Bundle-Name: VEX Core Tests
-Bundle-SymbolicName: org.eclipse.wst.xml.vex.core.tests
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.wst.xml.vex.core.tests;singleton:=true
 Bundle-Version: 0.5.0.qualifier
 Bundle-Activator: org.eclipse.wst.xml.vex.core.tests.VEXCoreTestPlugin
-Bundle-Vendor: Eclipse.org
+Bundle-Vendor: %providerName
 Require-Bundle: org.apache.xerces;bundle-version="2.9.0";visibility:=reexport,
  org.eclipse.ui,
  org.eclipse.core.runtime,
  org.eclipse.wst.xml.vex.core;bundle-version="0.5.0",
  org.junit;bundle-version="3.8.1",
  org.eclipse.core.resources;bundle-version="[3.4.100,4.0.0)",
- org.w3c.css.sac;bundle-version="[1.3.0,2.0.0)"
+ org.w3c.css.sac;bundle-version="[1.3.0,2.0.0)",
+ org.eclipse.emf.ecore;bundle-version="2.4.1",
+ org.eclipse.emf.ecore.xmi;bundle-version="2.4.1"
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-ActivationPolicy: lazy
 Export-Package: org.eclipse.wst.xml.vex.core.internal.css;x-internal:=true,
  org.eclipse.wst.xml.vex.core.internal.dom;x-internal:=true,
  org.eclipse.wst.xml.vex.core.internal.layout;x-internal:=true,
+ org.eclipse.wst.xml.vex.core.internal.provisional.dom.tests;x-internal:=true,
  org.eclipse.wst.xml.vex.core.tests
diff --git a/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/build.properties b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/build.properties
index 577b7ce..4662209 100644
--- a/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/build.properties
+++ b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/build.properties
@@ -1,6 +1,8 @@
-source.. = src/
+source.. = src/,\
+           src_emf/
 output.. = bin/
 bin.includes = META-INF/,\
                .,\
                projectFiles/,\
-               bin/
+               bin/,\
+               plugin.properties
diff --git a/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/plugin.properties b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/plugin.properties
new file mode 100644
index 0000000..0a347eb
--- /dev/null
+++ b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/plugin.properties
@@ -0,0 +1,2 @@
+pluginName = VEX Core Tests
+providerName = Eclipse.org
diff --git a/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/ContentTest.java b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/ContentTest.java
new file mode 100644
index 0000000..48b6b38
--- /dev/null
+++ b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/ContentTest.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFFactory;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Content</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following operations are tested:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content#createPosition(int) <em>Create Position</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content#insertString(int, java.lang.String) <em>Insert String</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content#remove(int, int) <em>Remove</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content#getString(int, int) <em>Get String</em>}</li>
+ * </ul>
+ * </p>
+ * @generated
+ */
+public class ContentTest extends TestCase {
+
+	/**
+	 * The fixture for this Content test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected Content fixture = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(ContentTest.class);
+	}
+
+	/**
+	 * Constructs a new Content test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ContentTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Sets the fixture for this Content test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void setFixture(Content fixture) {
+		this.fixture = fixture;
+	}
+
+	/**
+	 * Returns the fixture for this Content test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected Content getFixture() {
+		return fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	@Override
+	protected void setUp() throws Exception {
+		setFixture(DomEMFFactory.eINSTANCE.createContent());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	@Override
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content#createPosition(int) <em>Create Position</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content#createPosition(int)
+	 * @generated
+	 */
+	public void testCreatePosition__int() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content#insertString(int, java.lang.String) <em>Insert String</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content#insertString(int, java.lang.String)
+	 * @generated
+	 */
+	public void testInsertString__int_String() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content#remove(int, int) <em>Remove</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content#remove(int, int)
+	 * @generated
+	 */
+	public void testRemove__int_int() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content#getString(int, int) <em>Get String</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content#getString(int, int)
+	 * @generated
+	 */
+	public void testGetString__int_int() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+} //ContentTest
diff --git a/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/DomEMFExample.java b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/DomEMFExample.java
new file mode 100644
index 0000000..a60e436
--- /dev/null
+++ b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/DomEMFExample.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.tests;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.URI;
+
+import org.eclipse.emf.ecore.EObject;
+
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+
+import org.eclipse.emf.ecore.util.Diagnostician;
+
+import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFFactory;
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFPackage;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content;
+
+/**
+ * <!-- begin-user-doc -->
+ * A sample utility for the '<em><b>dom</b></em>' package.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class DomEMFExample {
+	/**
+	 * <!-- begin-user-doc -->
+	 * Load all the argument file paths or URIs as instances of the model.
+	 * <!-- end-user-doc -->
+	 * @param args the file paths or URIs.
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		// Create a resource set to hold the resources.
+		//
+		ResourceSet resourceSet = new ResourceSetImpl();
+		
+		// Register the appropriate resource factory to handle all file extensions.
+		//
+		resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put
+			(Resource.Factory.Registry.DEFAULT_EXTENSION, 
+			 new XMIResourceFactoryImpl());
+
+		// Register the package to ensure it is available during loading.
+		//
+		resourceSet.getPackageRegistry().put
+			(DomEMFPackage.eNS_URI, 
+			 DomEMFPackage.eINSTANCE);
+        
+		// If there are no arguments, emit an appropriate usage message.
+		//
+		if (args.length == 0) {
+			System.out.println("Enter a list of file paths or URIs that have content like this:");
+			try {
+				Resource resource = resourceSet.createResource(URI.createURI("http:///My.domemf"));
+				Content root = DomEMFFactory.eINSTANCE.createContent();
+				resource.getContents().add(root);
+				resource.save(System.out, null);
+			}
+			catch (IOException exception) {
+				exception.printStackTrace();
+			}
+		}
+		else {
+			// Iterate over all the arguments.
+			//
+			for (int i = 0; i < args.length; ++i) {
+				// Construct the URI for the instance file.
+				// The argument is treated as a file path only if it denotes an existing file.
+				// Otherwise, it's directly treated as a URL.
+				//
+				File file = new File(args[i]);
+				URI uri = file.isFile() ? URI.createFileURI(file.getAbsolutePath()): URI.createURI(args[0]);
+
+				try {
+					// Demand load resource for this file.
+					//
+					Resource resource = resourceSet.getResource(uri, true);
+					System.out.println("Loaded " + uri);
+
+					// Validate the contents of the loaded resource.
+					//
+					for (EObject eObject : resource.getContents()) {
+						Diagnostic diagnostic = Diagnostician.INSTANCE.validate(eObject);
+						if (diagnostic.getSeverity() != Diagnostic.OK) {
+							printDiagnostic(diagnostic, "");
+						}
+					}
+				}
+				catch (RuntimeException exception) {
+					System.out.println("Problem loading " + uri);
+					exception.printStackTrace();
+				}
+			}
+		}
+	}
+	
+	/**
+	 * <!-- begin-user-doc -->
+	 * Prints diagnostics with indentation.
+	 * <!-- end-user-doc -->
+	 * @param diagnostic the diagnostic to print.
+	 * @param indent the indentation for printing.
+	 * @generated
+	 */
+	protected static void printDiagnostic(Diagnostic diagnostic, String indent) {
+		System.out.print(indent);
+		System.out.println(diagnostic.getMessage());
+		for (Diagnostic child : diagnostic.getChildren()) {
+			printDiagnostic(child, indent + "  ");
+		}
+	}
+
+} //DomEMFExample
diff --git a/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/DomEMFTests.java b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/DomEMFTests.java
new file mode 100644
index 0000000..5d73f78
--- /dev/null
+++ b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/DomEMFTests.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ *Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ *All rights reserved. This program and 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:
+ *    David Carver (STAR)  - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import junit.textui.TestRunner;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test suite for the '<em><b>dom</b></em>' package.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class DomEMFTests extends TestSuite {
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(suite());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static Test suite() {
+		TestSuite suite = new DomEMFTests("dom Tests");
+		suite.addTestSuite(ContentTest.class);
+		suite.addTestSuite(VEXAttributeTest.class);
+		suite.addTestSuite(VEXDocumentTest.class);
+		suite.addTestSuite(VEXElementTest.class);
+		suite.addTestSuite(VEXProcessingInstructionTest.class);
+		suite.addTestSuite(ValidatorTest.class);
+		return suite;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DomEMFTests(String name) {
+		super(name);
+	}
+
+} //DomEMFTests
diff --git a/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/PositionTest.java b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/PositionTest.java
new file mode 100644
index 0000000..5f747b9
--- /dev/null
+++ b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/PositionTest.java
@@ -0,0 +1,88 @@
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFFactory;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Position;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Position</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class PositionTest extends TestCase {
+
+	/**
+	 * The fixture for this Position test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected Position fixture = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(PositionTest.class);
+	}
+
+	/**
+	 * Constructs a new Position test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public PositionTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Sets the fixture for this Position test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void setFixture(Position fixture) {
+		this.fixture = fixture;
+	}
+
+	/**
+	 * Returns the fixture for this Position test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected Position getFixture() {
+		return fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	@Override
+	protected void setUp() throws Exception {
+		setFixture(DomEMFFactory.eINSTANCE.createPosition());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	@Override
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //PositionTest
diff --git a/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/SerializableTest.java b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/SerializableTest.java
new file mode 100644
index 0000000..419397a
--- /dev/null
+++ b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/SerializableTest.java
@@ -0,0 +1,59 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: SerializableTest.java,v 1.1 2008/11/10 20:09:46 dacarver Exp $
+ */
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.tests;
+
+import java.io.Serializable;
+
+import junit.framework.TestCase;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Serializable</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public abstract class SerializableTest extends TestCase {
+
+	/**
+	 * The fixture for this Serializable test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected Serializable fixture = null;
+
+	/**
+	 * Constructs a new Serializable test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public SerializableTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Sets the fixture for this Serializable test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void setFixture(Serializable fixture) {
+		this.fixture = fixture;
+	}
+
+	/**
+	 * Returns the fixture for this Serializable test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected Serializable getFixture() {
+		return fixture;
+	}
+
+} //SerializableTest
diff --git a/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VEXAttributeTest.java b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VEXAttributeTest.java
new file mode 100644
index 0000000..02cee34
--- /dev/null
+++ b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VEXAttributeTest.java
@@ -0,0 +1,94 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: VEXAttributeTest.java,v 1.1 2008/11/10 20:09:46 dacarver Exp $
+ */
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.tests;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFFactory;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>VEX Attribute</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following operations are tested:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#setNamespace(java.lang.String, java.lang.String) <em>Set Namespace</em>}</li>
+ * </ul>
+ * </p>
+ * @generated
+ */
+public class VEXAttributeTest extends VEXNodeTest {
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(VEXAttributeTest.class);
+	}
+
+	/**
+	 * Constructs a new VEX Attribute test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXAttributeTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Returns the fixture for this VEX Attribute test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected VEXAttribute getFixture() {
+		return (VEXAttribute)fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	@Override
+	protected void setUp() throws Exception {
+		setFixture(DomEMFFactory.eINSTANCE.createVEXAttribute());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	@Override
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#setNamespace(java.lang.String, java.lang.String) <em>Set Namespace</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXAttribute#setNamespace(java.lang.String, java.lang.String)
+	 * @generated
+	 */
+	public void testSetNamespace__String_String() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+} //VEXAttributeTest
diff --git a/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VEXCommentTest.java b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VEXCommentTest.java
new file mode 100644
index 0000000..8a5834a
--- /dev/null
+++ b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VEXCommentTest.java
@@ -0,0 +1,75 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: VEXCommentTest.java,v 1.1 2008/11/10 20:09:46 dacarver Exp $
+ */
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.tests;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFFactory;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXComment;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>VEX Comment</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class VEXCommentTest extends VEXNodeTest {
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(VEXCommentTest.class);
+	}
+
+	/**
+	 * Constructs a new VEX Comment test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXCommentTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Returns the fixture for this VEX Comment test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected VEXComment getFixture() {
+		return (VEXComment)fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	@Override
+	protected void setUp() throws Exception {
+		setFixture(DomEMFFactory.eINSTANCE.createVEXComment());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	@Override
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //VEXCommentTest
diff --git a/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VEXDocumentFragmentTest.java b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VEXDocumentFragmentTest.java
new file mode 100644
index 0000000..a277eb3
--- /dev/null
+++ b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VEXDocumentFragmentTest.java
@@ -0,0 +1,94 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: VEXDocumentFragmentTest.java,v 1.1 2008/11/10 20:09:46 dacarver Exp $
+ */
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFFactory;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>VEX Document Fragment</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class VEXDocumentFragmentTest extends TestCase {
+
+	/**
+	 * The fixture for this VEX Document Fragment test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected VEXDocumentFragment fixture = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(VEXDocumentFragmentTest.class);
+	}
+
+	/**
+	 * Constructs a new VEX Document Fragment test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXDocumentFragmentTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Sets the fixture for this VEX Document Fragment test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void setFixture(VEXDocumentFragment fixture) {
+		this.fixture = fixture;
+	}
+
+	/**
+	 * Returns the fixture for this VEX Document Fragment test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected VEXDocumentFragment getFixture() {
+		return fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	@Override
+	protected void setUp() throws Exception {
+		setFixture(DomEMFFactory.eINSTANCE.createVEXDocumentFragment());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	@Override
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //VEXDocumentFragmentTest
diff --git a/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VEXDocumentTest.java b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VEXDocumentTest.java
new file mode 100644
index 0000000..a7699a5
--- /dev/null
+++ b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VEXDocumentTest.java
@@ -0,0 +1,309 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: VEXDocumentTest.java,v 1.1 2008/11/10 20:09:46 dacarver Exp $
+ */
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFFactory;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>VEX Document</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following operations are tested:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#canInsertFragment(int, org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment) <em>Can Insert Fragment</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#canInsertText(int) <em>Can Insert Text</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#createPosition(int) <em>Create Position</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#delete(int, int) <em>Delete</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#findCommonElement(int, int) <em>Find Common Element</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getCharacterAt(int) <em>Get Character At</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getElementAt(int) <em>Get Element At</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getFragment(int, int) <em>Get Fragment</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getNodeNames(int, int) <em>Get Node Names</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getNodes(int, int) <em>Get Nodes</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getRawText(int, int) <em>Get Raw Text</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getText(int, int) <em>Get Text</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#insertElement(int, org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement) <em>Insert Element</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#insertFragment(int, org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment) <em>Insert Fragment</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#insertText(int, java.lang.String) <em>Insert Text</em>}</li>
+ * </ul>
+ * </p>
+ * @generated
+ */
+public class VEXDocumentTest extends TestCase {
+
+	/**
+	 * The fixture for this VEX Document test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected VEXDocument fixture = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(VEXDocumentTest.class);
+	}
+
+	/**
+	 * Constructs a new VEX Document test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXDocumentTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Sets the fixture for this VEX Document test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void setFixture(VEXDocument fixture) {
+		this.fixture = fixture;
+	}
+
+	/**
+	 * Returns the fixture for this VEX Document test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected VEXDocument getFixture() {
+		return fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	@Override
+	protected void setUp() throws Exception {
+		setFixture(DomEMFFactory.eINSTANCE.createVEXDocument());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	@Override
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#canInsertFragment(int, org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment) <em>Can Insert Fragment</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#canInsertFragment(int, org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment)
+	 * @generated
+	 */
+	public void testCanInsertFragment__int_VEXDocumentFragment() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#canInsertText(int) <em>Can Insert Text</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#canInsertText(int)
+	 * @generated
+	 */
+	public void testCanInsertText__int() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#createPosition(int) <em>Create Position</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#createPosition(int)
+	 * @generated
+	 */
+	public void testCreatePosition__int() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#delete(int, int) <em>Delete</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#delete(int, int)
+	 * @generated
+	 */
+	public void testDelete__int_int() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#findCommonElement(int, int) <em>Find Common Element</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#findCommonElement(int, int)
+	 * @generated
+	 */
+	public void testFindCommonElement__int_int() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getCharacterAt(int) <em>Get Character At</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getCharacterAt(int)
+	 * @generated
+	 */
+	public void testGetCharacterAt__int() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getElementAt(int) <em>Get Element At</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getElementAt(int)
+	 * @generated
+	 */
+	public void testGetElementAt__int() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getFragment(int, int) <em>Get Fragment</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getFragment(int, int)
+	 * @generated
+	 */
+	public void testGetFragment__int_int() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getNodeNames(int, int) <em>Get Node Names</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getNodeNames(int, int)
+	 * @generated
+	 */
+	public void testGetNodeNames__int_int() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getNodes(int, int) <em>Get Nodes</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getNodes(int, int)
+	 * @generated
+	 */
+	public void testGetNodes__int_int() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getRawText(int, int) <em>Get Raw Text</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getRawText(int, int)
+	 * @generated
+	 */
+	public void testGetRawText__int_int() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getText(int, int) <em>Get Text</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#getText(int, int)
+	 * @generated
+	 */
+	public void testGetText__int_int() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#insertElement(int, org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement) <em>Insert Element</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#insertElement(int, org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement)
+	 * @generated
+	 */
+	public void testInsertElement__int_VEXElement() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#insertFragment(int, org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment) <em>Insert Fragment</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#insertFragment(int, org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocumentFragment)
+	 * @generated
+	 */
+	public void testInsertFragment__int_VEXDocumentFragment() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#insertText(int, java.lang.String) <em>Insert Text</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXDocument#insertText(int, java.lang.String)
+	 * @generated
+	 */
+	public void testInsertText__int_String() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+} //VEXDocumentTest
diff --git a/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VEXElementTest.java b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VEXElementTest.java
new file mode 100644
index 0000000..8292b0a
--- /dev/null
+++ b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VEXElementTest.java
@@ -0,0 +1,192 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: VEXElementTest.java,v 1.1 2008/11/10 20:09:46 dacarver Exp $
+ */
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.tests;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFFactory;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>VEX Element</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following operations are tested:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#addChild(org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement) <em>Add Child</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#clone() <em>Clone</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getAttribute(java.lang.String) <em>Get Attribute</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#removeAttribute(java.lang.String) <em>Remove Attribute</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#setAttribute(java.lang.String, java.lang.String) <em>Set Attribute</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#setContent(org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content, int, int) <em>Set Content</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#insertChild(int, org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement) <em>Insert Child</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#setNamespace(java.lang.String, java.lang.String) <em>Set Namespace</em>}</li>
+ * </ul>
+ * </p>
+ * @generated
+ */
+public class VEXElementTest extends VEXNodeTest {
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(VEXElementTest.class);
+	}
+
+	/**
+	 * Constructs a new VEX Element test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXElementTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Returns the fixture for this VEX Element test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected VEXElement getFixture() {
+		return (VEXElement)fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	@Override
+	protected void setUp() throws Exception {
+		setFixture(DomEMFFactory.eINSTANCE.createVEXElement());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	@Override
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#addChild(org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement) <em>Add Child</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#addChild(org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement)
+	 * @generated
+	 */
+	public void testAddChild__VEXElement() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#clone() <em>Clone</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#clone()
+	 * @generated
+	 */
+	public void testClone() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getAttribute(java.lang.String) <em>Get Attribute</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#getAttribute(java.lang.String)
+	 * @generated
+	 */
+	public void testGetAttribute__String() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#removeAttribute(java.lang.String) <em>Remove Attribute</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#removeAttribute(java.lang.String)
+	 * @generated
+	 */
+	public void testRemoveAttribute__String() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#setAttribute(java.lang.String, java.lang.String) <em>Set Attribute</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#setAttribute(java.lang.String, java.lang.String)
+	 * @generated
+	 */
+	public void testSetAttribute__String_String() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#setContent(org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content, int, int) <em>Set Content</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#setContent(org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Content, int, int)
+	 * @generated
+	 */
+	public void testSetContent__Content_int_int() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#insertChild(int, org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement) <em>Insert Child</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#insertChild(int, org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement)
+	 * @generated
+	 */
+	public void testInsertChild__int_VEXElement() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#setNamespace(java.lang.String, java.lang.String) <em>Set Namespace</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXElement#setNamespace(java.lang.String, java.lang.String)
+	 * @generated
+	 */
+	public void testSetNamespace__String_String() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+} //VEXElementTest
diff --git a/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VEXNodeTest.java b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VEXNodeTest.java
new file mode 100644
index 0000000..6c3a25f
--- /dev/null
+++ b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VEXNodeTest.java
@@ -0,0 +1,94 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: VEXNodeTest.java,v 1.1 2008/11/10 20:09:46 dacarver Exp $
+ */
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFFactory;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXNode;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>VEX Node</b></em>'.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class VEXNodeTest extends TestCase {
+
+	/**
+	 * The fixture for this VEX Node test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected VEXNode fixture = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(VEXNodeTest.class);
+	}
+
+	/**
+	 * Constructs a new VEX Node test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXNodeTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Sets the fixture for this VEX Node test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void setFixture(VEXNode fixture) {
+		this.fixture = fixture;
+	}
+
+	/**
+	 * Returns the fixture for this VEX Node test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected VEXNode getFixture() {
+		return fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	@Override
+	protected void setUp() throws Exception {
+		setFixture(DomEMFFactory.eINSTANCE.createVEXNode());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	@Override
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+} //VEXNodeTest
diff --git a/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VEXProcessingInstructionTest.java b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VEXProcessingInstructionTest.java
new file mode 100644
index 0000000..a004dd6
--- /dev/null
+++ b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VEXProcessingInstructionTest.java
@@ -0,0 +1,108 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: VEXProcessingInstructionTest.java,v 1.1 2008/11/10 20:09:46 dacarver Exp $
+ */
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.tests;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFFactory;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXProcessingInstruction;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>VEX Processing Instruction</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following operations are tested:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXProcessingInstruction#removeAttribute(java.lang.String) <em>Remove Attribute</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXProcessingInstruction#setAttribute(java.lang.String, java.lang.String) <em>Set Attribute</em>}</li>
+ * </ul>
+ * </p>
+ * @generated
+ */
+public class VEXProcessingInstructionTest extends VEXNodeTest {
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(VEXProcessingInstructionTest.class);
+	}
+
+	/**
+	 * Constructs a new VEX Processing Instruction test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VEXProcessingInstructionTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Returns the fixture for this VEX Processing Instruction test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected VEXProcessingInstruction getFixture() {
+		return (VEXProcessingInstruction)fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	@Override
+	protected void setUp() throws Exception {
+		setFixture(DomEMFFactory.eINSTANCE.createVEXProcessingInstruction());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	@Override
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXProcessingInstruction#removeAttribute(java.lang.String) <em>Remove Attribute</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXProcessingInstruction#removeAttribute(java.lang.String)
+	 * @generated
+	 */
+	public void testRemoveAttribute__String() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXProcessingInstruction#setAttribute(java.lang.String, java.lang.String) <em>Set Attribute</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.VEXProcessingInstruction#setAttribute(java.lang.String, java.lang.String)
+	 * @generated
+	 */
+	public void testSetAttribute__String_String() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+} //VEXProcessingInstructionTest
diff --git a/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/ValidatorTest.java b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/ValidatorTest.java
new file mode 100644
index 0000000..bfe30ca
--- /dev/null
+++ b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/ValidatorTest.java
@@ -0,0 +1,168 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: ValidatorTest.java,v 1.1 2008/11/10 20:09:46 dacarver Exp $
+ */
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.tests;
+
+import junit.framework.TestCase;
+
+import junit.textui.TestRunner;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.DomEMFFactory;
+
+import org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test case for the model object '<em><b>Validator</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following operations are tested:
+ * <ul>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator#getAttributeDefinition(java.lang.String, java.lang.String) <em>Get Attribute Definition</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator#getAttributeDefinitions(java.lang.String) <em>Get Attribute Definitions</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator#getValidItems(java.lang.String) <em>Get Valid Items</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator#isValidSequence(java.lang.String, org.eclipse.emf.common.util.EList, boolean) <em>Is Valid Sequence</em>}</li>
+ *   <li>{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator#isValidSequence(java.lang.String, org.eclipse.emf.common.util.EList, org.eclipse.emf.common.util.EList, org.eclipse.emf.common.util.EList, boolean) <em>Is Valid Sequence</em>}</li>
+ * </ul>
+ * </p>
+ * @generated
+ */
+public class ValidatorTest extends TestCase {
+
+	/**
+	 * The fixture for this Validator test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected Validator fixture = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(ValidatorTest.class);
+	}
+
+	/**
+	 * Constructs a new Validator test case with the given name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ValidatorTest(String name) {
+		super(name);
+	}
+
+	/**
+	 * Sets the fixture for this Validator test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void setFixture(Validator fixture) {
+		this.fixture = fixture;
+	}
+
+	/**
+	 * Returns the fixture for this Validator test case.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected Validator getFixture() {
+		return fixture;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#setUp()
+	 * @generated
+	 */
+	@Override
+	protected void setUp() throws Exception {
+		setFixture(DomEMFFactory.eINSTANCE.createValidator());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see junit.framework.TestCase#tearDown()
+	 * @generated
+	 */
+	@Override
+	protected void tearDown() throws Exception {
+		setFixture(null);
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator#getAttributeDefinition(java.lang.String, java.lang.String) <em>Get Attribute Definition</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator#getAttributeDefinition(java.lang.String, java.lang.String)
+	 * @generated
+	 */
+	public void testGetAttributeDefinition__String_String() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * 
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void testGetAttributeDefinitions__String() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator#getValidItems(java.lang.String) <em>Get Valid Items</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator#getValidItems(java.lang.String)
+	 * @generated
+	 */
+	public void testGetValidItems__String() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator#isValidSequence(java.lang.String, org.eclipse.emf.common.util.EList, boolean) <em>Is Valid Sequence</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator#isValidSequence(java.lang.String, org.eclipse.emf.common.util.EList, boolean)
+	 * @generated
+	 */
+	public void testIsValidSequence__String_EList_boolean() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+	/**
+	 * Tests the '{@link org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator#isValidSequence(java.lang.String, org.eclipse.emf.common.util.EList, org.eclipse.emf.common.util.EList, org.eclipse.emf.common.util.EList, boolean) <em>Is Valid Sequence</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.wst.xml.vex.core.internal.provisional.dom.I.Validator#isValidSequence(java.lang.String, org.eclipse.emf.common.util.EList, org.eclipse.emf.common.util.EList, org.eclipse.emf.common.util.EList, boolean)
+	 * @generated
+	 */
+	public void testIsValidSequence__String_EList_EList_EList_boolean() {
+		// TODO: implement this operation test method
+		// Ensure that you remove @generated or mark it @generated NOT
+		fail();
+	}
+
+} //ValidatorTest
diff --git a/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VexdocumentAllTests.java b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VexdocumentAllTests.java
new file mode 100644
index 0000000..2d34857
--- /dev/null
+++ b/sourceediting/tests/org.eclipse.wst.xml.vex.core.tests/src_emf/org/eclipse/wst/xml/vex/core/internal/provisional/dom/tests/VexdocumentAllTests.java
@@ -0,0 +1,51 @@
+/**
+ * <copyright>
+ * </copyright>
+ *
+ * $Id: VexdocumentAllTests.java,v 1.1 2008/11/10 20:09:46 dacarver Exp $
+ */
+package org.eclipse.wst.xml.vex.core.internal.provisional.dom.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import junit.textui.TestRunner;
+
+/**
+ * <!-- begin-user-doc -->
+ * A test suite for the '<em><b>Vexdocument</b></em>' model.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class VexdocumentAllTests extends TestSuite {
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static void main(String[] args) {
+		TestRunner.run(suite());
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static Test suite() {
+		TestSuite suite = new VexdocumentAllTests("Vexdocument Tests");
+		suite.addTest(DomEMFTests.suite());
+		return suite;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VexdocumentAllTests(String name) {
+		super(name);
+	}
+
+} //VexdocumentAllTests
