diff --git a/jsf/tests/org.eclipse.jst.pagedesigner.tests/.classpath b/jsf/tests/org.eclipse.jst.pagedesigner.tests/.classpath
new file mode 100644
index 0000000..472ee29
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.pagedesigner.tests/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/jsf/tests/org.eclipse.jst.pagedesigner.tests/.project b/jsf/tests/org.eclipse.jst.pagedesigner.tests/.project
new file mode 100644
index 0000000..a04c986
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.pagedesigner.tests/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.pagedesigner.tests</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/jsf/tests/org.eclipse.jst.pagedesigner.tests/META-INF/MANIFEST.MF b/jsf/tests/org.eclipse.jst.pagedesigner.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5f2d435
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.pagedesigner.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,27 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.jst.pagedesigner.tests
+Bundle-Version: 1.0.0.qualifier
+Bundle-Vendor: %Bundle-Vendor.0
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Localization: plugin
+Require-Bundle: org.junit;bundle-version="[3.8.1,4.0.0)",
+ org.eclipse.jst.jsf.test.util;bundle-version="[1.0.0,1.1.0)",
+ org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jst.jsf.core.tests;bundle-version="[1.0.0,1.1.0)",
+ org.eclipse.jst.jsf.core;bundle-version="[1.0.0,1.1.0)",
+ org.eclipse.ui;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jst.jsf.common;bundle-version="[1.0.0,1.1.0)",
+ org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.jst.jsp.core;bundle-version="[1.1.0,1.3.0)",
+ org.eclipse.wst.html.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
+ org.eclipse.jface.text;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.jst.pagedesigner;bundle-version="[1.0.0,1.1.0)",
+ org.eclipse.emf.common;bundle-version="[2.2.0,2.4.0)"
+Export-Package: org.eclipse.jst.pagedesigner.tests;x-internal:=true
+Bundle-ClassPath: pagedesignertests.jar
+Bundle-Activator: org.eclipse.jst.pagedesigner.tests.PageDesignerTestsPlugin
+Eclipse-LazyStart: true
diff --git a/jsf/tests/org.eclipse.jst.pagedesigner.tests/about.html b/jsf/tests/org.eclipse.jst.pagedesigner.tests/about.html
new file mode 100644
index 0000000..131bdcf
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.pagedesigner.tests/about.html
@@ -0,0 +1,22 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>August 01, 2007</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
+
+</body>
+</html>
diff --git a/jsf/tests/org.eclipse.jst.pagedesigner.tests/build.properties b/jsf/tests/org.eclipse.jst.pagedesigner.tests/build.properties
new file mode 100644
index 0000000..bb32779
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.pagedesigner.tests/build.properties
@@ -0,0 +1,21 @@
+###############################################################################
+# Copyright (c) 2006 Oracle Corporation.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#     Oracle - initial API and implementation
+###############################################################################
+bin.includes = META-INF/,\
+               pagedesignertests.jar,\
+               plugin.properties,\
+               about.html,\
+               testdata/,\
+               test.xml
+source.pagedesignertests.jar = src/
+output.pagedesignertests.jar = bin/
+jars.compile.order = pagedesignertests.jar
+javacSource=1.5
+javacTarget=1.5
diff --git a/jsf/tests/org.eclipse.jst.pagedesigner.tests/plugin.properties b/jsf/tests/org.eclipse.jst.pagedesigner.tests/plugin.properties
new file mode 100644
index 0000000..2595a80
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.pagedesigner.tests/plugin.properties
@@ -0,0 +1,13 @@
+###############################################################################
+# Copyright (c) 2001, 2007 Oracle Corporation 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:
+#     Oracle Corporation - initial API and implementation
+###############################################################################
+
+Bundle-Name.0=JavaServer Faces Tools - Web Page Editor Tests Plug-in
+Bundle-Vendor.0=Eclipse.org
diff --git a/jsf/tests/org.eclipse.jst.pagedesigner.tests/src/org/eclipse/jst/pagedesigner/tests/AllTests.java b/jsf/tests/org.eclipse.jst.pagedesigner.tests/src/org/eclipse/jst/pagedesigner/tests/AllTests.java
new file mode 100644
index 0000000..ac9d9d7
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.pagedesigner.tests/src/org/eclipse/jst/pagedesigner/tests/AllTests.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2006 Oracle Corporation 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:
+ *     Oracle Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.pagedesigner.tests;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * All tests suite for Web Page Editor.
+ * 
+ * @author Ian Trimble - Oracle
+ *
+ */
+public class AllTests {
+	/**
+	 * @return the test suite
+	 */
+	public static Test suite() {
+		TestSuite suite = new TestSuite("Test for org.eclipse.jst.pagedesigner");
+		//$JUnit-BEGIN$
+		
+		//tests requiring jsfRuntimeJarsDirectoryV1.1
+		addTestRequiringJSFRuntime(suite, Test_DTManager.class, "1.1");
+		addTestRequiringJSFRuntime(suite, Test_TransformOperations.class, "1.1");
+
+		//$JUnit-END$
+		return suite;
+	}
+
+	private static void addTestRequiringJSFRuntime(TestSuite suite, Class testClass, String jsfVersion) {
+		if (Utils.isJSFRuntimeJarsDirectoryValid(jsfVersion)) {
+			suite.addTestSuite(testClass);
+		} else {
+			System.err.println(Utils.getTestRequiresJSFRuntimeMessage(testClass, jsfVersion));
+		}
+	}
+
+}
diff --git a/jsf/tests/org.eclipse.jst.pagedesigner.tests/src/org/eclipse/jst/pagedesigner/tests/PageDesignerTestsPlugin.java b/jsf/tests/org.eclipse.jst.pagedesigner.tests/src/org/eclipse/jst/pagedesigner/tests/PageDesignerTestsPlugin.java
new file mode 100644
index 0000000..2c385d0
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.pagedesigner.tests/src/org/eclipse/jst/pagedesigner/tests/PageDesignerTestsPlugin.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Oracle Corporation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Ian Trimble - Oracle: initial API and implementation
+ *    
+ ********************************************************************************/
+
+package org.eclipse.jst.pagedesigner.tests;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class PageDesignerTestsPlugin extends AbstractUIPlugin {
+
+	/**
+	 * The plug-in ID
+	 */
+	public static final String PLUGIN_ID = "org.eclipse.jst.pagedesigner.tests";
+
+	// The shared instance
+	private static PageDesignerTestsPlugin plugin;
+	
+	/**
+	 * The constructor
+	 */
+	public PageDesignerTestsPlugin() {
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static PageDesignerTestsPlugin getDefault() {
+		return plugin;
+	}
+
+}
diff --git a/jsf/tests/org.eclipse.jst.pagedesigner.tests/src/org/eclipse/jst/pagedesigner/tests/Test_DTManager.java b/jsf/tests/org.eclipse.jst.pagedesigner.tests/src/org/eclipse/jst/pagedesigner/tests/Test_DTManager.java
new file mode 100644
index 0000000..c14f180
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.pagedesigner.tests/src/org/eclipse/jst/pagedesigner/tests/Test_DTManager.java
@@ -0,0 +1,246 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 Oracle Corporation 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:
+ *     Oracle Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.pagedesigner.tests;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
+import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
+import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
+import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
+import org.eclipse.jst.jsf.core.IJSFCoreConstants;
+import org.eclipse.jst.jsf.core.tests.util.JSFFacetedTestEnvironment;
+import org.eclipse.jst.jsf.test.util.JSFTestUtil;
+import org.eclipse.jst.jsf.test.util.WebProjectTestEnvironment;
+import org.eclipse.jst.jsp.core.internal.domdocument.DOMModelForJSP;
+import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
+import org.eclipse.jst.pagedesigner.converter.ITagConverter;
+import org.eclipse.jst.pagedesigner.dtmanager.DTManager;
+import org.eclipse.jst.pagedesigner.dtmanager.IDTInfo;
+import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
+import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
+
+/**
+ * DTManager tests.
+ * 
+ * @author Ian Trimble - Oracle
+ */
+public class Test_DTManager extends TestCase {
+
+	private WebProjectTestEnvironment webProjectTestEnv;
+
+	protected void setUp() throws Exception {
+		super.setUp();
+
+		JSFTestUtil.setValidationEnabled(false);
+
+		webProjectTestEnv = new WebProjectTestEnvironment("Test_DTManager_" + getName());
+		webProjectTestEnv.createProject(false);
+		assertNotNull(webProjectTestEnv);
+		assertNotNull(webProjectTestEnv.getTestProject());
+		assertTrue(webProjectTestEnv.getTestProject().isAccessible());
+
+        JSFFacetedTestEnvironment jsfFacetedTestEnv = new JSFFacetedTestEnvironment(webProjectTestEnv);
+        jsfFacetedTestEnv.initialize(IJSFCoreConstants.FACET_VERSION_1_1);
+
+        webProjectTestEnv.loadResourceInWebRoot(
+        		PageDesignerTestsPlugin.getDefault().getBundle(),
+        		"/testdata/Test_DTManager.jsp.data",
+        		"/Test_DTManager.jsp");
+
+        assertTrue(Utils.addJSFRuntimeJarsToClasspath("1.1", jsfFacetedTestEnv));
+	}
+
+	/**
+	 * Sanity check.
+	 */
+	public void testSanity() {
+		ContextWrapper wrapper = null;
+		try {
+			wrapper = getDocumentContext("/WebContent/Test_DTManager.jsp", 477);
+			IStructuredDocumentContext context = wrapper.getContext();
+            IDOMContextResolver resolver =
+                IStructuredDocumentContextResolverFactory.INSTANCE.
+                    getDOMContextResolver(context);
+            Node node = resolver.getNode();
+            assertTrue(node instanceof Element);
+            assertTrue(node.getPrefix().equals("h"));
+            assertTrue(node.getLocalName().equals("outputText"));
+		} catch(Exception ex) {
+			ex.printStackTrace();
+			fail(ex.getLocalizedMessage());
+		} finally {
+			if (wrapper != null) {
+				wrapper.dispose();
+			}
+		}
+	}
+
+	/**
+	 * Test "getTagConverter(...)" method.
+	 */
+	public void testGetTagConverter() {
+		ContextWrapper wrapper = null;
+		try {
+			wrapper = getDocumentContext("/WebContent/Test_DTManager.jsp", 477);
+			IStructuredDocumentContext context = wrapper.getContext();
+            IDOMContextResolver resolver =
+                IStructuredDocumentContextResolverFactory.INSTANCE.
+                    getDOMContextResolver(context);
+
+            //get Element
+            Node node = resolver.getNode();
+            assertTrue(node instanceof Element);
+            assertTrue(node.getPrefix().equals("h"));
+            assertTrue(node.getLocalName().equals("outputText"));
+            Element element = (Element)node;
+
+            //get IDOMDocument
+            IStructuredModel model = wrapper.getModel();
+            assertTrue(model instanceof IDOMModel);
+            IDOMDocument document = ((IDOMModel)model).getDocument();
+            assertNotNull(document);
+
+            //get ITagConverter instance
+            ITagConverter tagConverter = DTManager.getInstance().getTagConverter(
+            		element,
+            		IConverterFactory.MODE_DESIGNER,
+            		document);
+            assertNotNull(tagConverter);
+
+            //invoke ITagConverter instance
+            tagConverter.convertRefresh(null);
+
+            //test result element to ensure operations were discovered and invoked
+            Element resultElement = tagConverter.getResultElement();
+            assertNotNull(resultElement);
+            assertTrue(resultElement.getLocalName().equals("span"));
+            assertNull(resultElement.getAttributeNode("value"));
+            NodeList childNodes = resultElement.getChildNodes();
+            assertTrue(childNodes.getLength() == 1);
+           	Node childNode = childNodes.item(0);
+            assertTrue(childNode instanceof Text);
+            assertTrue(((Text)childNode).getData().equals("valueValue"));
+            assertNull(resultElement.getAttributeNode("styleClass"));
+            assertNotNull(resultElement.getAttributeNode("class"));
+            assertTrue(resultElement.getAttribute("class").equals("classValue"));
+            assertNotNull(resultElement.getAttributeNode("attr1"));
+            assertTrue(resultElement.getAttribute("attr1").equals("attr1Value"));
+		} catch(Exception ex) {
+			ex.printStackTrace();
+			fail(ex.getLocalizedMessage());
+		} finally {
+			if (wrapper != null) {
+				wrapper.dispose();
+			}
+		}
+	}
+
+	/**
+	 * Test "getDTInfo(...)" method.
+	 */
+	public void testGetDTInfo() {
+		ContextWrapper wrapper = null;
+		try {
+			wrapper = getDocumentContext("/WebContent/Test_DTManager.jsp", 477);
+			IStructuredDocumentContext context = wrapper.getContext();
+            IDOMContextResolver resolver =
+                IStructuredDocumentContextResolverFactory.INSTANCE.
+                    getDOMContextResolver(context);
+
+            //get Element
+            Node node = resolver.getNode();
+            assertTrue(node instanceof Element);
+            assertTrue(node.getPrefix().equals("h"));
+            assertTrue(node.getLocalName().equals("outputText"));
+            Element element = (Element)node;
+
+            //get IDTInfo instance
+            IDTInfo dtInfo = DTManager.getInstance().getDTInfo(element);
+            assertNotNull(dtInfo);
+
+            //test IDTInfo instance
+            TagConvertInfo tcInfo = dtInfo.getTagConvertInfo();
+            List operations = tcInfo.getOperations();
+            assertNotNull(operations);
+            assertEquals(4, operations.size());
+            List tdInfos = dtInfo.getTagDecorateInfos();
+            assertEquals(2, tdInfos.size());
+            TagDecorateInfo tdInfoDesign = dtInfo.getTagDecorateInfo("vpd-decorate-design");
+            assertNotNull(tdInfoDesign);
+            assertTrue(tdInfoDesign.isNeedBorderDecorator());
+            assertTrue(tdInfoDesign.isMultiLevel());
+            assertTrue(tdInfoDesign.isWidget());
+            assertTrue(tdInfoDesign.isSetNonVisualChildElements());
+            TagDecorateInfo tdInfoPreview = dtInfo.getTagDecorateInfo("vpd-decorate-preview");
+            assertNotNull(tdInfoPreview);
+            assertTrue(tdInfoPreview.isResolveChildText());
+		} catch(Exception ex) {
+			ex.printStackTrace();
+			fail(ex.getLocalizedMessage());
+		} finally {
+			if (wrapper != null) {
+				wrapper.dispose();
+			}
+		}
+		
+	}
+
+    private ContextWrapper getDocumentContext(String path, int offset) throws Exception {
+        IProject project = webProjectTestEnv.getTestProject();
+        IFile jspFile = project.getFile(new Path(path));
+        assertTrue(jspFile.exists());
+        final IModelManager modelManager = 
+            StructuredModelManager.getModelManager();
+        IStructuredModel model = null;
+        model = modelManager.getModelForRead(jspFile);
+        assertTrue(model instanceof DOMModelForJSP);
+        final IStructuredDocumentContext context =
+        	IStructuredDocumentContextFactory.INSTANCE.getContext(
+        			model.getStructuredDocument(),
+        			offset);
+        return new ContextWrapper(context, model);
+    }
+
+    private static class ContextWrapper {
+        private final IStructuredDocumentContext context;
+        private final IStructuredModel model;
+        ContextWrapper(final IStructuredDocumentContext context, final IStructuredModel model) {
+            super();
+            this.context = context;
+            this.model = model;
+        }
+        IStructuredDocumentContext getContext() {
+            return context;
+        }
+        IStructuredModel getModel() {
+            return model;
+        }
+        void dispose() {
+            model.releaseFromRead();
+        }
+    }
+
+}
diff --git a/jsf/tests/org.eclipse.jst.pagedesigner.tests/src/org/eclipse/jst/pagedesigner/tests/Test_TransformOperations.java b/jsf/tests/org.eclipse.jst.pagedesigner.tests/src/org/eclipse/jst/pagedesigner/tests/Test_TransformOperations.java
new file mode 100644
index 0000000..aecb6fa
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.pagedesigner.tests/src/org/eclipse/jst/pagedesigner/tests/Test_TransformOperations.java
@@ -0,0 +1,599 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 Oracle Corporation 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:
+ *     Oracle Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.pagedesigner.tests;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
+import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
+import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
+import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
+import org.eclipse.jst.jsf.core.IJSFCoreConstants;
+import org.eclipse.jst.jsf.core.tests.util.JSFFacetedTestEnvironment;
+import org.eclipse.jst.jsf.test.util.JSFTestUtil;
+import org.eclipse.jst.jsf.test.util.WebProjectTestEnvironment;
+import org.eclipse.jst.jsp.core.internal.domdocument.DOMModelForJSP;
+import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
+import org.eclipse.jst.pagedesigner.converter.ITagConverter;
+import org.eclipse.jst.pagedesigner.dtmanager.DTManager;
+import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
+import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.TransformOperationFactory;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
+
+/**
+ * DTManager tests.
+ * 
+ * @author Ian Trimble - Oracle
+ */
+public class Test_TransformOperations extends TestCase {
+
+	private WebProjectTestEnvironment webProjectTestEnv;
+
+	protected void setUp() throws Exception {
+		super.setUp();
+
+		JSFTestUtil.setValidationEnabled(false);
+
+		webProjectTestEnv = new WebProjectTestEnvironment("Test_TransformOperations_" + getName());
+		webProjectTestEnv.createProject(false);
+		assertNotNull(webProjectTestEnv);
+		assertNotNull(webProjectTestEnv.getTestProject());
+		assertTrue(webProjectTestEnv.getTestProject().isAccessible());
+
+        JSFFacetedTestEnvironment jsfFacetedTestEnv = new JSFFacetedTestEnvironment(webProjectTestEnv);
+        jsfFacetedTestEnv.initialize(IJSFCoreConstants.FACET_VERSION_1_1);
+
+        webProjectTestEnv.loadResourceInWebRoot(
+        		PageDesignerTestsPlugin.getDefault().getBundle(),
+        		"/testdata/Test_TransformOperations.jsp.data",
+        		"/Test_TransformOperations.jsp");
+
+        assertTrue(Utils.addJSFRuntimeJarsToClasspath("1.1", jsfFacetedTestEnv));
+	}
+
+	/**
+	 * Sanity check.
+	 */
+	public void testSanity() {
+		ContextWrapper wrapper = null;
+		try {
+			wrapper = getDocumentContext("/WebContent/Test_TransformOperations.jsp", 477);
+			IStructuredDocumentContext context = wrapper.getContext();
+            IDOMContextResolver resolver =
+                IStructuredDocumentContextResolverFactory.INSTANCE.
+                    getDOMContextResolver(context);
+            Node node = resolver.getNode();
+            assertTrue(node instanceof Element);
+            assertEquals("h", node.getPrefix());
+            assertEquals("selectManyListbox", node.getLocalName());
+		} catch(Exception ex) {
+			ex.printStackTrace();
+			fail(ex.getLocalizedMessage());
+		} finally {
+			if (wrapper != null) {
+				wrapper.dispose();
+			}
+		}
+	}
+
+	/**
+	 * Test "AppendChildElementOperation".
+	 */
+	public void testAppendChildElementOperation() {
+		try {
+			//get and test result element
+			Element resultElement = getResultElement(477, "h", "selectManyListbox");
+			assertNotNull(resultElement);
+			assertEquals("select", resultElement.getLocalName());
+
+			//check first child node exists and is correct node
+			Node firstChildNode = resultElement.getFirstChild();
+			assertTrue(firstChildNode instanceof Element);
+			Element firstChildElement = (Element)firstChildNode;
+			assertEquals("option", firstChildElement.getLocalName());
+
+		} catch(Exception ex) {
+			ex.printStackTrace();
+			fail(ex.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Test "AppendChildTextFromXPathOperation".
+	 */
+	public void testAppendChildTextFromXPathOperation() {
+		try {
+			//get and test result element
+			Element resultElement = getResultElement(477, "h", "selectManyListbox");
+			assertNotNull(resultElement);
+			assertEquals("select", resultElement.getLocalName());
+
+			//check first child node exists and is correct node
+			Node firstChildNode = resultElement.getFirstChild();
+			assertTrue(firstChildNode instanceof Element);
+			Element firstChildElement = (Element)firstChildNode;
+			assertEquals("option", firstChildElement.getLocalName());
+
+			//check grandchild Text exists and has correct value
+			Node firstGrandChildNode = firstChildElement.getFirstChild();
+			assertTrue(firstGrandChildNode instanceof Text);
+			Text firstGrandChildText = (Text)firstGrandChildNode;
+			assertEquals("selectItem One", firstGrandChildText.getData());
+
+		} catch(Exception ex) {
+			ex.printStackTrace();
+			fail(ex.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Test "AppendChildTextOperation".
+	 */
+	public void testAppendChildTextOperation() {
+		try {
+			//get and test result element
+			Element resultElement = getResultElement(477, "h", "selectManyListbox");
+			assertNotNull(resultElement);
+			assertEquals("select", resultElement.getLocalName());
+
+			//check second child node exists and is correct node
+			NodeList childNodes = resultElement.getChildNodes();
+			assertTrue(childNodes.getLength() > 1);
+			Node secondChildNode = childNodes.item(1);
+			assertTrue(secondChildNode instanceof Element);
+			Element secondChildElement = (Element)secondChildNode;
+			assertEquals("option", secondChildElement.getLocalName());
+
+			//check grandchild Text exists and has correct value
+			Node firstGrandChildNode = secondChildElement.getFirstChild();
+			assertTrue(firstGrandChildNode instanceof Text);
+			Text firstGrandChildText = (Text)firstGrandChildNode;
+			assertEquals("selectItem", firstGrandChildText.getData());
+
+		} catch(Exception ex) {
+			ex.printStackTrace();
+			fail(ex.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Test "ConvertAttributeToTextOperation".
+	 */
+	public void testConvertAttributeToTextOperation() {
+		try {
+			//get and test result element
+			Element resultElement = getResultElement(620, "h", "commandLink");
+			assertNotNull(resultElement);
+			assertEquals("a", resultElement.getLocalName());
+
+			//check first child Text exists and has correct value
+			Node firstChildNode = resultElement.getFirstChild();
+			assertTrue(firstChildNode instanceof Text);
+			Text firstChildText = (Text)firstChildNode;
+			assertEquals("commandLink value", firstChildText.getData());
+
+		} catch(Exception ex) {
+			ex.printStackTrace();
+			fail(ex.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Test "CopyAllAttributesOperation".
+	 */
+	public void testCopyAllAttributesOperation() {
+		try {
+			//get and test result element
+			Element resultElement = getResultElement(620, "h", "commandLink");
+			assertNotNull(resultElement);
+			assertEquals("a", resultElement.getLocalName());
+
+			//check attributes exist and have correct values
+			String attr1Value = resultElement.getAttribute("attr1");
+			assertEquals("attr1_value", attr1Value);
+			String attr2Value = resultElement.getAttribute("attr2");
+			assertEquals("attr2_value", attr2Value);
+
+		} catch(Exception ex) {
+			ex.printStackTrace();
+			fail(ex.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Test "CopyAttributeOperation".
+	 */
+	public void testCopyAttributeOperation() {
+		try {
+			//get and test result element
+			Element resultElement = getResultElement(477, "h", "selectManyListbox");
+			assertNotNull(resultElement);
+			assertEquals("select", resultElement.getLocalName());
+
+			//check first child node exists and is correct node
+			Node firstChildNode = resultElement.getFirstChild();
+			assertTrue(firstChildNode instanceof Element);
+			Element firstChildElement = (Element)firstChildNode;
+			assertEquals("option", firstChildElement.getLocalName());
+
+			//check first child node has correct attribute with correct value
+			String valueAttrValue = firstChildElement.getAttribute("value");
+			assertEquals("selectItem_1", valueAttrValue);
+
+		} catch(Exception ex) {
+			ex.printStackTrace();
+			fail(ex.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Test "CopyChildrenOperation".
+	 */
+	public void testCopyChildrenOperation() {
+		ContextWrapper wrapper = null;
+		try {
+			wrapper = getDocumentContext("/WebContent/Test_TransformOperations.jsp", 620);
+			IStructuredDocumentContext context = wrapper.getContext();
+            IDOMContextResolver resolver =
+                IStructuredDocumentContextResolverFactory.INSTANCE.
+                    getDOMContextResolver(context);
+
+            //get Element
+            Node node = resolver.getNode();
+            assertTrue(node instanceof Element);
+            assertEquals("h", node.getPrefix());
+            assertEquals("commandLink", node.getLocalName());
+            Element element = (Element)node;
+
+            //get IDOMDocument
+            IStructuredModel model = wrapper.getModel();
+            assertTrue(model instanceof IDOMModel);
+            IDOMDocument document = ((IDOMModel)model).getDocument();
+            assertNotNull(document);
+
+            //get ITagConverter instance
+            ITagConverter tagConverter = DTManager.getInstance().getTagConverter(
+            		element,
+            		IConverterFactory.MODE_DESIGNER,
+            		document);
+            assertNotNull(tagConverter);
+
+            //invoke ITagConverter instance
+            tagConverter.convertRefresh(null);
+
+            //test tag converter to ensure correct child element was copied to child node list
+            List childNodes = tagConverter.getChildModeList();
+            assertTrue(childNodes.size() > 1);
+            Node secondChildNode = (Node)childNodes.get(1);
+            assertTrue(secondChildNode instanceof Element);
+            Element secondChildElement = (Element)secondChildNode;
+            assertEquals("f", secondChildElement.getPrefix());
+            assertEquals("actionListener", secondChildElement.getLocalName());
+
+		} catch(Exception ex) {
+			ex.printStackTrace();
+			fail(ex.getLocalizedMessage());
+		} finally {
+			if (wrapper != null) {
+				wrapper.dispose();
+			}
+		}
+	}
+
+	/**
+	 * Test "CreateAttributeFromXPathOperation".
+	 */
+	public void testCreateAttributeFromXPathOperation() {
+		try {
+			//get and test result element
+			Element resultElement = getResultElement(477, "h", "selectManyListbox");
+			assertNotNull(resultElement);
+			assertEquals("select", resultElement.getLocalName());
+
+			//check size attribute has been calculated and set
+			String sizeAttrValue = resultElement.getAttribute("size");
+			assertEquals("2", sizeAttrValue);
+
+		} catch(Exception ex) {
+			ex.printStackTrace();
+			fail(ex.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Test "CreateAttributeOperation".
+	 */
+	public void testCreateAttributeOperation() {
+		try {
+			//get and test result element
+			Element resultElement = getResultElement(477, "h", "selectManyListbox");
+			assertNotNull(resultElement);
+			assertEquals("select", resultElement.getLocalName());
+
+			//check multiple attribute has been set
+			String multipleAttrValue = resultElement.getAttribute("multiple");
+			assertEquals("multiple", multipleAttrValue);
+
+		} catch(Exception ex) {
+			ex.printStackTrace();
+			fail(ex.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Test "CreateElementOperation".
+	 */
+	public void testCreateElementOperation() {
+		try {
+			//get and test result element
+			Element resultElement = getResultElement(477, "h", "selectManyListbox");
+			assertNotNull(resultElement);
+			assertEquals("select", resultElement.getLocalName());
+
+		} catch(Exception ex) {
+			ex.printStackTrace();
+			fail(ex.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Test "IfNotOperation".
+	 */
+	public void testIfNotOperation() {
+		try {
+			//get and test result element
+			Element resultElement = getResultElement(477, "h", "selectManyListbox");
+			assertNotNull(resultElement);
+			assertEquals("select", resultElement.getLocalName());
+
+			//check size attribute has been calculated and set (only occurs if the IfNotOperation is successful)
+			String sizeAttrValue = resultElement.getAttribute("size");
+			assertEquals("2", sizeAttrValue);
+
+		} catch(Exception ex) {
+			ex.printStackTrace();
+			fail(ex.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Test "IfOperation".
+	 */
+	public void testIfOperation() {
+		try {
+			//get and test result element
+			Element resultElement = getResultElement(477, "h", "selectManyListbox");
+			assertNotNull(resultElement);
+			assertEquals("select", resultElement.getLocalName());
+
+			//check first child node exists and is correct node
+			Node firstChildNode = resultElement.getFirstChild();
+			assertTrue(firstChildNode instanceof Element);
+			Element firstChildElement = (Element)firstChildNode;
+			assertEquals("option", firstChildElement.getLocalName());
+
+			//check grandchild Text exists and has correct value (only occurs if the IfOperation is successful)
+			Node firstGrandChildNode = firstChildElement.getFirstChild();
+			assertTrue(firstGrandChildNode instanceof Text);
+			Text firstGrandChildText = (Text)firstGrandChildNode;
+			assertEquals("selectItem One", firstGrandChildText.getData());
+
+		} catch(Exception ex) {
+			ex.printStackTrace();
+			fail(ex.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Test "IterateOverElementsOperation".
+	 */
+	public void testIterateOverElementsOperation() {
+		try {
+			//get and test result element
+			Element resultElement = getResultElement(477, "h", "selectManyListbox");
+			assertNotNull(resultElement);
+			assertEquals("select", resultElement.getLocalName());
+
+			//check two child nodes exist and are correct nodes
+			NodeList childNodes = resultElement.getChildNodes();
+			assertEquals(2, childNodes.getLength());
+			for (int i = 0; i < childNodes.getLength(); i++) {
+				Node childNode = childNodes.item(i);
+				assertTrue(childNode instanceof Element);
+				Element childElement = (Element)childNode;
+				assertEquals("option", childElement.getLocalName());
+			}
+
+		} catch(Exception ex) {
+			ex.printStackTrace();
+			fail(ex.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Test "MakeParentElementCurrentOperation".
+	 */
+	public void testMakeParentElementCurrentOperation() {
+		try {
+			//get and test result element
+			Element resultElement = getResultElement(477, "h", "selectManyListbox");
+			assertNotNull(resultElement);
+			assertEquals("select", resultElement.getLocalName());
+
+			//check two child nodes exist and are correct nodes (only occurs if the MakeParentElementCurrentOperation is successful)
+			NodeList childNodes = resultElement.getChildNodes();
+			assertEquals(2, childNodes.getLength());
+			for (int i = 0; i < childNodes.getLength(); i++) {
+				Node childNode = childNodes.item(i);
+				assertTrue(childNode instanceof Element);
+				Element childElement = (Element)childNode;
+				assertEquals("option", childElement.getLocalName());
+			}
+
+		} catch(Exception ex) {
+			ex.printStackTrace();
+			fail(ex.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Test "RemoveAttributeOperation".
+	 */
+	public void testRemoveAttributeOperation() {
+		try {
+			//get and test result element
+			Element resultElement = getResultElement(477, "h", "selectManyListbox");
+			assertNotNull(resultElement);
+			assertEquals("select", resultElement.getLocalName());
+
+			//check multiple attribute has been set
+			String multipleAttrValue = resultElement.getAttribute("multiple");
+			assertEquals("multiple", multipleAttrValue);
+
+			//remove multiple attribute and assert it no longer exists
+			ITransformOperation removeAttrOp =
+				TransformOperationFactory.getInstance().getTransformOperation(
+						TransformOperationFactory.OP_RemoveAttributeOperation,
+						new String[]{"multiple"});
+			removeAttrOp.transform(null, resultElement);
+			Node multipleAttrNode = resultElement.getAttributeNode("multiple");
+			assertNull(multipleAttrNode);
+
+		} catch(Exception ex) {
+			ex.printStackTrace();
+			fail(ex.getLocalizedMessage());
+		}
+	}
+
+	/**
+	 * Test "RenameAttributeOperation".
+	 */
+	public void testRenameAttributeOperation() {
+		try {
+			//get and test result element
+			Element resultElement = getResultElement(477, "h", "selectManyListbox");
+			assertNotNull(resultElement);
+			assertEquals("select", resultElement.getLocalName());
+
+			//check first child node exists and is correct node
+			Node firstChildNode = resultElement.getFirstChild();
+			assertTrue(firstChildNode instanceof Element);
+			Element firstChildElement = (Element)firstChildNode;
+			assertEquals("option", firstChildElement.getLocalName());
+
+			//check first child node has correct attribute with correct value
+			String valueAttrValue = firstChildElement.getAttribute("value");
+			assertEquals("selectItem_1", valueAttrValue);
+
+		} catch(Exception ex) {
+			ex.printStackTrace();
+			fail(ex.getLocalizedMessage());
+		}
+	}
+
+	private Element getResultElement(int docOffset, String prefix, String localName) throws Exception {
+		Element resultElement = null;
+		ContextWrapper wrapper = null;
+		try {
+			wrapper = getDocumentContext("/WebContent/Test_TransformOperations.jsp", docOffset);
+			IStructuredDocumentContext context = wrapper.getContext();
+            IDOMContextResolver resolver =
+                IStructuredDocumentContextResolverFactory.INSTANCE.
+                    getDOMContextResolver(context);
+
+            //get Element
+            Node node = resolver.getNode();
+            if (
+            		node instanceof Element &&
+            		node.getPrefix().equals(prefix) &&
+            		node.getLocalName().equals(localName)) {
+
+            	Element element = (Element)node;
+
+	            //get IDOMDocument
+	            IStructuredModel model = wrapper.getModel();
+	            if (model instanceof IDOMModel) {
+		            IDOMDocument document = ((IDOMModel)model).getDocument();
+		            if (document != null) {
+		
+			            //get ITagConverter instance
+			            ITagConverter tagConverter = DTManager.getInstance().getTagConverter(
+			            		element,
+			            		IConverterFactory.MODE_DESIGNER,
+			            		document);
+			            if (tagConverter != null) {
+			
+				            //invoke ITagConverter instance
+				            tagConverter.convertRefresh(null);
+				
+				            //get result element
+				            resultElement = tagConverter.getResultElement();
+			            }
+		            }
+	            }
+            }
+		} finally {
+			if (wrapper != null) {
+				wrapper.dispose();
+			}
+		}		
+		return resultElement;
+	}
+
+    private ContextWrapper getDocumentContext(String path, int offset) throws Exception {
+        IProject project = webProjectTestEnv.getTestProject();
+        IFile jspFile = project.getFile(new Path(path));
+        assertTrue(jspFile.exists());
+        final IModelManager modelManager = 
+            StructuredModelManager.getModelManager();
+        IStructuredModel model = null;
+        model = modelManager.getModelForRead(jspFile);
+        assertTrue(model instanceof DOMModelForJSP);
+        final IStructuredDocumentContext context =
+        	IStructuredDocumentContextFactory.INSTANCE.getContext(
+        			model.getStructuredDocument(),
+        			offset);
+        return new ContextWrapper(context, model);
+    }
+
+    private static class ContextWrapper {
+        private final IStructuredDocumentContext context;
+        private final IStructuredModel model;
+        ContextWrapper(final IStructuredDocumentContext context, final IStructuredModel model) {
+            super();
+            this.context = context;
+            this.model = model;
+        }
+        IStructuredDocumentContext getContext() {
+            return context;
+        }
+        IStructuredModel getModel() {
+            return model;
+        }
+        void dispose() {
+            model.releaseFromRead();
+        }
+    }
+
+}
diff --git a/jsf/tests/org.eclipse.jst.pagedesigner.tests/src/org/eclipse/jst/pagedesigner/tests/Utils.java b/jsf/tests/org.eclipse.jst.pagedesigner.tests/src/org/eclipse/jst/pagedesigner/tests/Utils.java
new file mode 100644
index 0000000..2992786
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.pagedesigner.tests/src/org/eclipse/jst/pagedesigner/tests/Utils.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2007 Oracle Corporation 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:
+ *     Oracle Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.pagedesigner.tests;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
+import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
+import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
+import org.eclipse.jst.jsf.core.tests.util.JSFCoreUtilHelper;
+import org.eclipse.jst.jsf.core.tests.util.JSFFacetedTestEnvironment;
+import org.eclipse.jst.jsf.test.util.JSFTestUtil;
+
+/**
+ * Web Page Editor test utilities.
+ * 
+ * @author Ian Trimble - Oracle
+ */
+public class Utils {
+
+	public static String[] getJSFRuntimeJarNames(String jsfVersion) {
+		String[] jarNames = null;
+		String dirName = JSFTestUtil.getJSFRuntimeJarsDirectory(jsfVersion);
+		if (dirName != null) {
+			File dir = new File(dirName);
+			if (dir.exists() && dir.isDirectory()) {
+				File[] jars = dir.listFiles();
+				if (jars != null && jars.length > 0) {
+					jarNames = new String[jars.length];
+					for (int i = 0; i < jars.length; i++) {
+						jarNames[i] = jars[i].getAbsolutePath();
+					}
+				}
+			}
+		}
+		return jarNames;
+	}
+
+	public static boolean isJSFRuntimeJarsDirectoryValid(String jsfVersion) {
+		return getJSFRuntimeJarNames(jsfVersion) != null;
+	}
+
+	public static boolean addJSFRuntimeJarsToClasspath(String jsfVersion, JSFFacetedTestEnvironment jsfFacetedTestEnv) throws CoreException {
+		boolean success = false;
+		String[] jarNames = getJSFRuntimeJarNames(jsfVersion);
+		if (jarNames != null) {
+			JSFLibraryRegistry jsfLibRegistry = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry();
+			String libIDandName = "_internalJSFRuntimeLibraryV" + jsfVersion + "_";
+			JSFLibrary jsfImpl = JSFCoreUtilHelper.constructJSFLib(libIDandName, libIDandName, "", jarNames, true);
+			jsfLibRegistry.addJSFLibrary(jsfImpl);
+			jsfFacetedTestEnv.addJSFLibraryReference(jsfImpl, true);
+			success = true;
+		}
+		return success;
+	}
+
+	public static String getTestRequiresJSFRuntimeMessage(Class testClass, String jsfVersion) {
+		StringBuffer sb = new StringBuffer();
+		sb.append("Unable to run test suite \"");
+		sb.append(testClass.getName());
+		sb.append("\"; JSF runtime (v");
+		sb.append(jsfVersion);
+		sb.append(") is required but not present.\nSystem property or environment variable \"jsfRuntimeJarsDirectoryV");
+		sb.append(jsfVersion);
+		sb.append("\" must be set to point to a directory containing JSF runtime (v");
+		sb.append(jsfVersion);
+		sb.append(") JARs.");
+		return sb.toString();
+	}
+
+}
diff --git a/jsf/tests/org.eclipse.jst.pagedesigner.tests/test.xml b/jsf/tests/org.eclipse.jst.pagedesigner.tests/test.xml
new file mode 100644
index 0000000..9eae87d
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.pagedesigner.tests/test.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0"?>
+
+<project name="testsuite" default="run" basedir=".">
+  <!-- The property ${eclipse-home} should be passed into this script -->
+  <!-- Set a meaningful default value for when it is not. -->
+ <!-- <property name="eclipse-home" value="${basedir}\..\.."/> -->
+	<echo message="basedir ${basedir}" />
+	<echo message="eclipse place ${eclipse-home}" />
+  <!-- sets the properties plugin-name, and library-file -->
+  <property name="plugin-name" value="org.eclipse.jst.pagedesigner.tests"/>
+  <property name="library-file" value="${eclipse-home}/plugins/org.eclipse.test_3.1.0/library.xml"/>
+
+  <!-- This target holds all initialization code that needs to be done for -->
+  <!-- all tests that are to be run. Initialization for individual tests -->
+  <!-- should be done within the body of the suite target. -->
+  <target name="init">
+    <tstamp/>
+    <delete>
+      <fileset dir="${eclipse-home}" includes="org.eclipse.jst.pagedesigner.tests.*xml"/>
+    </delete>
+  </target>
+
+  <!-- This target defines the tests that need to be run. -->
+  <target name="suite">
+    <property name="jsf-folder" value="${eclipse-home}/jsf_folder"/>
+    <delete dir="${jsf-folder}" quiet="true"/>
+    <ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}">
+      <property name="data-dir" value="${jsf-folder}"/>
+      <property name="plugin-name" value="${plugin-name}"/>
+      <property name="classname" value="org.eclipse.jst.pagedesigner.tests.AllTests" />
+   	<property name="plugin-path" value="${eclipse-home}/plugins/${plugin-name}"/>
+    </ant>
+  </target>
+
+  <!-- This target holds code to cleanup the testing environment after -->
+  <!-- after all of the tests have been run. You can use this target to -->
+  <!-- delete temporary files that have been created. -->
+  <target name="cleanup">
+  </target>
+
+  <!-- This target runs the test suite. Any actions that need to happen -->
+  <!-- after all the tests have been run should go here. -->
+  <target name="run" depends="init,suite,cleanup">
+    <ant target="collect" antfile="${library-file}" dir="${eclipse-home}">
+      <property name="includes" value="org.eclipse.jst.pagedesigner.tests.*xml"/>
+      <property name="output-file" value="${plugin-name}.xml"/>
+    </ant>
+  </target>
+</project>
\ No newline at end of file
diff --git a/jsf/tests/org.eclipse.jst.pagedesigner.tests/testdata/Test_DTManager.jsp.data b/jsf/tests/org.eclipse.jst.pagedesigner.tests/testdata/Test_DTManager.jsp.data
new file mode 100644
index 0000000..272db0f
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.pagedesigner.tests/testdata/Test_DTManager.jsp.data
@@ -0,0 +1,17 @@
+<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
+<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+	<title>Test_DTManager</title>
+</head>
+<body>
+<f:view>
+	<h:form>
+		<h:outputText value="valueValue" styleClass="classValue" attr1="attr1Value"/>
+	</h:form>
+</f:view>
+</body>
+</html>
\ No newline at end of file
diff --git a/jsf/tests/org.eclipse.jst.pagedesigner.tests/testdata/Test_TransformOperations.jsp.data b/jsf/tests/org.eclipse.jst.pagedesigner.tests/testdata/Test_TransformOperations.jsp.data
new file mode 100644
index 0000000..19466bf
--- /dev/null
+++ b/jsf/tests/org.eclipse.jst.pagedesigner.tests/testdata/Test_TransformOperations.jsp.data
@@ -0,0 +1,23 @@
+<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
+<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+	<title>Test_DTManager</title>
+</head>
+<body>
+<f:view>
+	<h:form>
+		<h:selectManyListbox>
+			<f:selectItem itemLabel="selectItem One" itemValue="selectItem_1"/>
+			<f:selectItem/>
+		</h:selectManyListbox>
+		<h:commandLink value="commandLink value" attr1="attr1_value" attr2="attr2_value">
+			<f:actionListener/>
+		</h:commandLink>
+	</h:form>
+</f:view>
+</body>
+</html>
\ No newline at end of file
