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
